关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

时间:2024-05-30 21:21:04

    首先,我们先看下这个返回值-2147482646,这时int的最大值进行+1操作后的值,估计大家都已经知道造成这种结果的原因是再为mybatis配置相关属性时将defaultExecutorType设为BATCH的缘故.

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

那为什么这么配置会返回这个值呢?大家跟我一块去看看源码吧.

     开门见山,先让大家看下我的mybatis.xml配置

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

大家请忽略,涂鸦部分(嘻嘻...重点放在框住部分)

    第一,既然对数据的操作都要经过SqlSession来完成,那SqlSession又是哪来的呢?不啰嗦上源码.

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

由图可以看出,在设置SqlSessionFactory的时候新建的SqlSessionTemplate模板,SqlSessionTemplate是不是有点面熟?

对了就是我们在配置文件中的配置的SqlSessionTemplate.而且能从第一张图片中看到我们的defaultExecutorType就设为BATCH.

默认的就是BATCH.

那么我们现在获得到SqlSession后进行一次插入操作:

getSqlSession().insert("CustomerMailMapper.addMailInfo",mail);

那我们看源码SqlSession接口中对应的方法

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

接着去看实现类中的方法实现

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

可以看出,还是调用的他本身的update方法,那怎么办?接着看嘛...

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

终于让我们看到返回值的出处了,但这就完了么?还没有可以看出调用了自己的executor属性的update属性.

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

这Executor也是接口,那我们之间看他的实现类

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

有这几种,根据我们的配置当然会是执行BatchExecutor,但是当我们进到BatchExecutor是会发现他并没有update方法,那在哪呢?

原来他继承了BaseExecutor这个抽象类,BaseExecutor里有update方法.

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

可以看出这里返回的值是调用的本身的doUpdate方法,是不是感觉真相距离我们越来越近了,可以剧透下你的直觉是对的.来上图

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

看到我画的重点没,可以看出这个方法不管你的逻辑是怎么实现的直接给你返回了-2147482646.真是千呼万唤始出来啊.所以如果大家需要在向数据库插入数据时的返回值就把Batch给改掉,而这个值都可以设置那些呢?

Batch就是指的SqlSessionTemplate中的ExecutorType这个属性,而这个属性是个枚举类

关于使用mybatis向数据库中插入数据放回值为-2147482646的问题解析

只有是那种,所以你想要怎样,百度下这三种配置所对应的情况就行了.

(拜拜...)