诡异!MyBatis的Insert方法一直返回-2147482646?
作者 | 占小狼的博客
来源 | https://mp.weixin.qq.com/s/iV6BwQkjTXCvfrAwgj2V4w
前几天在做项目demo的时候,发现有一个很奇怪的现象,就是MyBatis发现更新和插入返回值一直为"-2147482646",无论怎么改,这个值一直不变...
实在摸不着头脑,百度和谷歌了一下,有这样的说法原来:是由defaultExecutorType设置引起的,如果设置为BATCH,更新返回值就会丢失。
If the BATCH executor is in use, the update counts are being lost.
操作
也就是说在spring的配置文件中,只要把constructor-arg中的executorType改为SIMPLE(以前的值是BATCH就会引发这个问题)或者直接注释掉就可以了
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg><!-- 执行类型 --><constructor-arg name="executorType" value="SIMPLE"></constructor-arg>
</bean>
这么一改果然好使,但是为啥会返回这个奇怪的数字呢?背后有啥原因?
本篇就来研究一下为什么会返回这个数字,打开我们的idea,又到了跟踪源码的时候了,走起。
1、打开配置文件中的变量,看到SqlSessionTemplate这个类有个构造参数类型ExecutorType了,也就是我们配置的值,当它为BATCH的时候又会怎么样呢?
你真的了解 OpenJDK 吗?
2、ExecutorType的参数,打开这个类发现它是个枚举类型,也就是说它仅仅只有3种配置的值,SIMPLE、RESUME、BATCH,在配置文件中我们也只能配这三种其中的一个
3、程序执行,可见最终操作的是SqlSession的insert方法,我们就来打开这个方法的源码:
Reader config = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
SqlSession sqlSession = sessionFactory.openSession();
String sql = "com.mlxs.mybatis.test.userMapper.insertUser";int res= sqlSession.insert(sql, "1");//
4、SqlSession.insert()方法:
public interface SqlSession extends Closeable {int insert(String var1);int insert(String var1, Object var2);}
SqlSession是一个接口,里面有insert方法,我们再来看一下这个接口的实现类:
一般在源码中,如果没有特殊配置肯定是采用的Default的设置,我们就来看看DefaultSqlSession的源码:
再找this.insert方法:
可以看到,它调用的是this.update方法,再来找一个update方法:
Spring Boot操作ES进行各种高级查询(值得收藏)
看到本质上它调用的是executor的update方法,我们再点进去看update方法:
可以看到它是一个接口,那么肯定要找实现类了:
这里就可以看出端倪了,如果没有配置缓存的话,肯定用的是BaseExecutor,那么我们在配置文件中配置的是Batch,毋庸置疑它肯定是选择BatchExecutor这个类中的update方法了:
阿里面试:“说一下从 url 输入到返回请求的过程”
千呼万唤始出来,这个奇怪的数字原来在这里出来的,其中可以看到它是固定返回的,没有任何判断逻辑...这样就证明了一点,只要你的insert方法在配置文件中配置的是batch,那么它肯定返回这个值!
5、当配置为simple返回的是什么?
根据上面的经验,这里我们直接看SimpleExecutor方法就行了:
接着再看StatementHandler就知道了:
我找到了SimpleStatementHandler的update方法,可以看到它返回是statement.getUpdateCount返回的数字,也就是实际影响的行数,那么就是正常的数值。
总结
本篇博客记录了一次源码追踪的过程,从而解释了为什么配置BATCH返回的是这个数字的原因,在实际的编程中,可能会遇到很多奇怪的问题,这时候就要敢于翻源码,答案一定在源码中,才能从根本上知道产生问题的原因。
往期推荐
坑你没商量!盘点Java中最常见的事故现场,你都中过哪些招?
你真的了解 OpenJDK 吗?
坚决不给中国人发Offer的GitLab成立中国公司!立志3-5年上市,怕是闻到了韭菜香?
紧随Java 16,Spring Framework 5.3.5 发布:涵盖JDK 16的支持!
哪家中国公司为Java 16贡献最多?Java第一大厂居然不是第一的...
如果你喜欢本文,欢迎关注我,订阅更多精彩内容
关注我回复「加群」,加入Spring技术交流群
免费领取:Java核心知识总结
喜欢的这里报道
↘↘↘
诡异!MyBatis的Insert方法一直返回-2147482646?相关推荐
- 发现一个很奇怪的现象,MyBaits 的 insert方法一直返回-2147482646
点击关注公众号,Java干货及时送达来源:cnblogs.com/wyq178/p/8652443.html 前几天在做项目demo的时候,发现有一个很奇怪的现象: 就是MyBatis发现更新和插入返 ...
- Mybatis的insert方法
insert方法 插入所有字段 Account account = new Account(); account.setExpiredDate(org.apache.commons.lang3.tim ...
- 关于Mybatis的insert方法返回值(将返回值受影响条数改为插入后的自增主键id)
今天做ssm项目的时候有一个这样的需求--我借阅一本书然后生成一条借阅记录(借阅记录的主键是递增的"borrowNum"),然后将这条记录的主键返回,在往上查阅资料后知道,只要在对 ...
- 【转载】mybaits的update、Insert、delete返回的是不是受影响的行数?
转自:https://blog.csdn.net/benben683280/article/details/79645697 update操作 返回值 mybatis执行update()方法默认返回为 ...
- Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1
记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...
- mybatis insert插入成功返回0_mybatis添加客户
在MyBatis的映射文件中,添加操作是通过元素来实现的.例如,向数据库中的t_customer表中插入一条数据可以通过如下配置来实现. 在上述配置代码中,传入的参数是一个Customer类型,该类型 ...
- 做工作流时候 Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1
Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要通过xx.getId()方法获取,因为 ...
- mybatis的insert语句获取自增id的方法(mySQL)
前提是数据库表里已经把id字段设置成了自增的 javabean的定义是这样的: package test;import java.util.Date;public class Express {pri ...
- mybatis+postgresql+insert返回主键,action,service侧
mybatis+postgresql+insert返回主键,action,service侧 在网上找了很久主要的内容如下: <insert id="insertDynaVisitInf ...
最新文章
- API编程基本控件使用
- 一份厘清「数据指标」问题的清单
- c 连接mysql示例 源码_MySQL 连接
- 企业实战_16_MyCat全局自增ID
- 联发科天玑800适配鸿蒙系统,联发科天玑800什么水平
- bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树
- eclipse技巧总结
- 标准布局类(11中布局类)
- 如何在 Mac 上进行屏幕录制?
- 基于Jenkins+Gitlab+Harbor+Rancher架构的CI/CD实现
- 开发功能更加完善的智能颈部按摩仪
- 跨境电商一件代发和专线小包是什么意思?有什么区别?
- 普通网站的建设和维护费用大概是多少?
- 如何摆脱NAS中的振动和噪音
- java编程电话号码查询_java课程设计电话号码查询系统(15页)-原创力文档
- ubuntu 10.04 恢复 默认桌面布局
- 思迈特Smartbi数据填报功能
- # 经典目标检测识别方法概述RCNN/FAST/FASTER RCNN/MASK RCNN/SSD/DSSD/YOLO V1/YOLO V2等
- 布线问题(分支限界)
- 重置天下霸图20200405进度