作者 | 占小狼的博客

来源 | 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?相关推荐

  1. 发现一个很奇怪的现象,MyBaits 的 insert方法一直返回-2147482646

    点击关注公众号,Java干货及时送达来源:cnblogs.com/wyq178/p/8652443.html 前几天在做项目demo的时候,发现有一个很奇怪的现象: 就是MyBatis发现更新和插入返 ...

  2. Mybatis的insert方法

    insert方法 插入所有字段 Account account = new Account(); account.setExpiredDate(org.apache.commons.lang3.tim ...

  3. 关于Mybatis的insert方法返回值(将返回值受影响条数改为插入后的自增主键id)

    今天做ssm项目的时候有一个这样的需求--我借阅一本书然后生成一条借阅记录(借阅记录的主键是递增的"borrowNum"),然后将这条记录的主键返回,在往上查阅资料后知道,只要在对 ...

  4. 【转载】mybaits的update、Insert、delete返回的是不是受影响的行数?

    转自:https://blog.csdn.net/benben683280/article/details/79645697 update操作 返回值 mybatis执行update()方法默认返回为 ...

  5. Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

    记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...

  6. mybatis insert插入成功返回0_mybatis添加客户

    在MyBatis的映射文件中,添加操作是通过元素来实现的.例如,向数据库中的t_customer表中插入一条数据可以通过如下配置来实现. 在上述配置代码中,传入的参数是一个Customer类型,该类型 ...

  7. 做工作流时候 Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

    Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要通过xx.getId()方法获取,因为 ...

  8. mybatis的insert语句获取自增id的方法(mySQL)

    前提是数据库表里已经把id字段设置成了自增的 javabean的定义是这样的: package test;import java.util.Date;public class Express {pri ...

  9. mybatis+postgresql+insert返回主键,action,service侧

    mybatis+postgresql+insert返回主键,action,service侧 在网上找了很久主要的内容如下: <insert id="insertDynaVisitInf ...

最新文章

  1. API编程基本控件使用
  2. 一份厘清「数据指标」问题的清单
  3. c 连接mysql示例 源码_MySQL 连接
  4. 企业实战_16_MyCat全局自增ID
  5. 联发科天玑800适配鸿蒙系统,联发科天玑800什么水平
  6. bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树
  7. eclipse技巧总结
  8. 标准布局类(11中布局类)
  9. 如何在 Mac 上进行屏幕录制?
  10. 基于Jenkins+Gitlab+Harbor+Rancher架构的CI/CD实现
  11. 开发功能更加完善的智能颈部按摩仪
  12. 跨境电商一件代发和专线小包是什么意思?有什么区别?
  13. 普通网站的建设和维护费用大概是多少?
  14. 如何摆脱NAS中的振动和噪音
  15. java编程电话号码查询_java课程设计电话号码查询系统(15页)-原创力文档
  16. ubuntu 10.04 恢复 默认桌面布局
  17. 思迈特Smartbi数据填报功能
  18. # 经典目标检测识别方法概述RCNN/FAST/FASTER RCNN/MASK RCNN/SSD/DSSD/YOLO V1/YOLO V2等
  19. 布线问题(分支限界)
  20. 重置天下霸图20200405进度

热门文章

  1. asp.net模糊查询存储过程
  2. “编译器错误信息: CS0016: 未能写入输出文件”解决方法
  3. linux shell 文件 第一行插入字符串
  4. linux 预加载 动态链接库rootkit 简介
  5. Web Service 开发工具 gSOAP 简介
  6. cmake编译时支持gdb调试
  7. java设计模式---状态模式
  8. C++中智能指针的设计和使用
  9. Linux离线时间设置(NTP)
  10. tarjan详解(转)