项目中经常看到这样的代码:
int rows = mypaymentDao.batchInsert(t);
//如果rows不大于0,即未插入成功
if (rows <= 0) {
throw new Sv2Exception("数据处理失败");
}
通过Mybatis,在对数据库增删改的操作中,我通常判断操作是否成功的处理,都是直接判断是否为0,并没有考虑到小于0的情况,也一直认为没有小于0的情况,但是抱着质疑的态度百度了一下,还真有小于0的情况。
是由于defaultExecutorType引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。
如果设置为BATCH,更新返回值就会丢失。Mybatis官网是这么描述的:If the BATCH executor is in use, the update counts are being lost.
其中defaultExecutorType的默认执行器是SIMPLE,所以想处理返回影响行数为负数的情况,要么把defaultExecutorType执行器的值改为SIMPLE或REUSE,或者直接删除该配置就可以了,要么在程序代码中添加数据库操作影响行数小于等于0的判断处理。
另外,在百度解决上面问题的过程中还了解到,update操作数据更新成功,返回的影响行数是0的情况,具体原因我就不赘述了,可以通过这篇blog了解一下。最后想说,实践出真知,百度真强大,网友啥都懂,赞一个!