MyBatis 怎么在批量更新时返回受影响的行数

胖涛吖_9458

胖涛吖_9458

2026-08-09

239人浏览

原创

mybatis批量更新默认不返回准确受影响行数,需同时配置jdbc的useaffectedrows=true和mybatis执行器为simple或reuse;推荐使用updatewrapper.in()单sql方式,可精准返回真实变更行数。

mybatis 怎么在批量更新时返回受影响的行数

MyBatis 批量更新默认不返回准确受影响行数,主要受执行器类型和 JDBC 配置影响。要拿到真实更新条数,需从两个层面配合调整:JDBC 连接参数 + MyBatis 执行器配置。

关键原因:BATCH 执行器会丢失行数

MyBatis 默认使用 SIMPLE 执行器,但很多项目显式配置为 BATCH 以提升批量性能。而 BATCH 模式底层调用 Statement.addBatch() + executeBatch(),JDBC 规范规定此时 executeBatch() 返回的是每条语句的更新计数数组——但 MyBatis 的 update() 方法只返回一个整数,且在 BATCH 模式下常统一返回 -1 或被截断。

  • BATCH 模式适合高吞吐写入,但放弃行数反馈
  • 若业务强依赖“到底改了几行”,就不能用 BATCH 执行器
  • REUSE 和 SIMPLE 模式可正常返回影响行数

必须配置 JDBC 的 useAffectedRows=true

即使执行器设为 SIMPLE,MySQL 驱动默认返回的是“匹配行数”(matched rows),而非“真正变更的行数”(changed rows)。比如字段值本来就是 20,再 SET age=20,MySQL 默认返回 1(匹配),但业务通常想要的是 0(未变更)。

解决办法是在数据库连接 URL 中添加参数:

jdbc:mysql://host:3306/db?useAffectedRows=true
  • 该参数让 MySQL 驱动调用 mysql_affected_rows() 而非 mysql_info()
  • Oracle、PostgreSQL 等数据库无需此参数,原生支持返回变更行数
  • Spring Boot 中可在 application.yml 的 spring.datasource.url 后追加

两种推荐的批量更新方式及返回行为

方式一:用 UpdateWrapper.in() 单次 SQL 更新(推荐)

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载

生成一条含 WHERE id IN (1,2,3) 的 UPDATE 语句,本质是单条 SQL,天然支持返回真实影响行数。

  • 代码简洁,事务安全,网络开销小
  • 返回值即实际被修改的记录数(如 3 条 ID 存在且字段值有变化,才返回 3)
  • 注意:null 字段默认不参与更新,需用 wrapper.setNull("col") 显式置空

方式二:用 updateBatchById()(慎用行数)

MyBatis-Plus 提供的该方法底层仍是循环执行单条 UPDATE,但受执行器影响大:

  • 若全局配置了 defaultExecutorType=BATCH,它仍可能返回 -1
  • 确保执行器为 SIMPLE 或 REUSE,且 JDBC 含 useAffectedRows=true,才能获得准确总数
  • 不适合超大批量(如 >1000 条),易触发 GC 或连接超时

验证是否生效的小技巧

执行一次批量更新后,打印返回值并手动查库比对:

  • 插入测试数据:INSERT INTO user(id, name, age) VALUES (1,'a',18), (2,'b',18), (3,'c',25);
  • 执行 UPDATE user SET age=18 WHERE id IN (1,2,3);
  • 正确配置下应返回 2(ID=1、2 的 age 原值非 18,被更新;ID=3 原值已是 18,不变更)
  • 若返回 3,说明 useAffectedRows=true 未生效
  • 若返回 -1,检查 defaultExecutorType 是否为 BATCH

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

2023.08.21

583

4

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2482

5

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

446

5

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

292

4

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

2025.08.26

5749

22

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

0

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习