前言:前几天在做项目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的时候又会怎么样呢?

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方法:

看到本质上它调用的是executor的update方法,我们再点进去看update方法:

可以看到它是一个接口,那么肯定要找实现类了:

这里就可以看出端倪了,如果没有配置缓存的话,肯定用的是BaseExecutor,那么我们在配置文件中配置的是Batch,毋庸置疑它肯定是选择BatchExecutor这个类中的update方法了:

千呼万唤始出来,这个奇怪的数字原来在这里出来的,其中可以看到它是固定返回的,没有任何判断逻辑...这样就证明了一点,只要你的insert方法在配置文件中配置的是batch,那么它肯定返回这个值!

5:当配置为simple返回的是什么?

根据上面的经验,这里我们直接看SimpleExecutor方法就行了:

接着再看StatementHandler就知道了:

我找到了SimpleStatementHandler的update方法,可以看到它返回是statement.getUpdateCount返回的数字,也就是实际影响的行数,那么就是正常的数值。

 总结:

本篇博客记录了一次源码追踪的过程,从而解释了为什么配置BATCH返回的是这个数字的原因,在实际的编程中,可能会遇到很多奇怪的问题,这时候就要敢于翻源码,答案一定在源码中,才能从根本上知道产生问题的原因。

解析Mybaits的insert方法返回数字-2147482646的原因的更多相关文章

  1. ArrayList中contains,remove方法返回为false的原因

    这几天做一个项目时,遇到ArrayList.remove(Object)方法失败,而ArrayList"包含"删除的对象,这其中的"包含"不是完全包含,请看下面 ...

  2. getSqlMapClientTemplate().insert()方法的返回值问题

    insert方法的返回值     今天碰到一个问题,就是关于ibatis的insert方法的返回值的问题.在网上找了很多例子,自己也亲自试了一下. 最后得出结论:insert方法返回的是在表中插入记录 ...

  3. STL—— 容器(vector)数据插入insert()方法 的返回值

    vector 容器下的 insert() 方法拥有返回值,由于insert() 方法拥有4种重载函数,他的返回值不尽相同. 第一种,插入单个元素后的返回值: 1 #include <iostre ...

  4. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

  5. 解析Xml四种方法

    关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文 ...

  6. JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器

    1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...

  7. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  8. IBatisNet:让insert操作返回新增记录的主键值

    项目引用ibatis包: IBatisNet.Common.dll --文件版本1.6.2.0 IBatisNet.DataAccess.dll IBatisNet.DataMapper.dll 项目 ...

  9. .NET面试题解析(04)-类型、方法与继承

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 做技术是清苦的.一个人,一台机器,相对无言,代码纷飞,bug无情.须梦里挑灯,冥思苦想,肝血暗耗,板凳坐穿 ...

随机推荐

  1. 21.1 XMLHttpRequest 对象【JavaScript高级程序设计第三版】

    IE5 是第一款引入XHR 对象的浏览器.在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的.因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLH ...

  2. python中的字符串(str)操作

    字符串是python中数据类型.一般就单引号(‘’)或双引号(“”)引起来的内容就是字符串. 例如:下面两个都是定义字符串 str1 = "hello world" str2 = ...

  3. c#vs连接SQL sever数据库入门操作

    对于需要连接数据库的项目,可以参考的简单初级代码.实现打开数据库,读入数据功能 using System; using System.Collections.Generic; using System ...

  4. 分布式系统的CAP(Redis)

    CAP理论就是说在分布式存储系统中,最多只能实现上面的两点.而由于当前的网络硬件肯定会出现延迟丢包等问题,所以 分区容忍性是我们必须需要实现的. 所以我们只能在一致性和可用性之间进行权衡,没有NoSQ ...

  5. 48-Identity MVC:Model前后端验证

    1-创建RegisterViewModel类 namespace MvcCookieAuthSample.ViewModel { public class RegisterViewModel { [R ...

  6. Oracle错误记录

    1 SQLPlus无法登陆oracle,PLSql可以登陆,报错ORA-12560 环境变量 右击计算机属性-->高级系统设置-->高级-->环境变量-->系统变量--> ...

  7. Electron入门应用打包exe(windows)

    最近在学习nodejs,得知Electron是通过将Chromium和Node.js合并到同一个运行时环境中,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一门技术.对于之前一直从 ...

  8. 使用sqoop将mysql中表导入hive中报错

    [hdfs@node1 root]$ sqoop import --connect jdbc:mysql://node2:3306/cm?charset-utf8 --username root -- ...

  9. spring读取properties和其他配置文件的几种方式

    1.因为spring容器的一些机制,在读取配置文件进行数据库的配置等等是很有必要的,所以我们要考虑配置文件的的读取方式以及各个方式的实用性 2.配置文件的读取方式我这里介绍2种,目的是掌握这2种就可以 ...

  10. 关于 SSH Server 的整体设定

    # . 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port # SSH 预设使用 这个 port,您也可以使用多的 port ! # 亦即重复使用 po ...