mybatis batch操作返回执行成功条数

https://www.cnblogs.com/wt20/p/11656437.html
https://blog.youkuaiyun.com/yoyochina/article/details/83300204
https://blog.youkuaiyun.com/qq_35451480/article/details/107201722

Statement.SUCCESS_NO_INFO(-2)代表:执行成功
List results = batchSqlSession.flushStatements();
int count=Arrays.stream(results.get(0).getUpdateCounts()).filter(s -> s == Statement.SUCCESS_NO_INFO).sum() / -2

ps:百度好多文章说 BATCH 执行器改为SIMPLE ,看项目吧,这边项目需要用到batch , so…

### MyBatis批量更新操作并获取受影响的记录条数MyBatis中,默认情况下,`Batch`执行器用于批量更新操作时不会返回实际影响的行数。这是因为`Batch`执行器通过缓存SQL来提升性能,在提交事务之前并不会真正执行这些SQL语句[^1]。 为了能够获得受批量更新影响的真实行数,一种解决方案是在完成所有的批处理命令之后手动调用`flushStatements()`方法强制刷新缓冲区中的SQL语句,并立即发送给数据库执行。这允许应用程序捕获到具体的变更情况而不是默认的匹配行数[^3]。 下面是一个简单的例子展示如何实现这一点: ```xml <update id="batchUpdateUsers" parameterType="java.util.List"> <foreach collection="list" item="user" separator=";"> UPDATE users SET name=#{user.name}, email=#{user.email} WHERE id=#{user.id} </foreach> </update> ``` ```java SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = getUsersToUpdate(); for (User user : userList) { mapper.updateUser(user); // 调用上面定义的方法 } int[] result = sqlSession.flushStatements(); // 获取每一条语句的影响行数数组 sqlSession.commit(); } finally { sqlSession.close(); } ``` 这段代码展示了如何利用`ExecutorType.BATCH`模式来进行高效的批量更新操作,同时还能得到每次更新具体影响了多少行的数据。 需要注意的是,如果希望在整个批次结束后只接收一个总的受影响行数而非每个单独语句的结果,则可以在循环外收集所有单次结果再求和;或者考虑其他方式如存储过程等更复杂的逻辑设计[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值