executebatch()返回int[]数组,各元素对应每条sql影响行数;失败时抛batchupdateexception,可用getupdatecounts()获取已执行结果;自增主键需用return_generated_keys参数配合getgeneratedkeys()获取。

Java 中批量数据库操作(如 executeBatch())本身不直接返回每条 SQL 的执行结果,但可以通过不同方式获取批量执行的返回值,具体取决于使用的 JDBC 驱动、SQL 类型(INSERT/UPDATE/DELETE)以及是否启用自增主键返回等特性。
使用 executeBatch() 获取影响行数数组
标准 JDBC 批量更新(addBatch() + executeBatch())会返回一个 int[],每个元素对应一次 addBatch() 调用所执行语句的影响行数(如 INSERT 1 行、UPDATE 匹配 3 行等)。
- 成功执行时,数组元素为非负整数,表示该语句影响的行数;
- 若某条语句执行失败(如违反约束),默认会抛出
BatchUpdateException,此时可通过e.getUpdateCounts()获取已执行成功的部分结果(JDBC 4.0+ 支持); - 需注意:MySQL 默认关闭
rewriteBatchedStatements=true,开启后才能真正合并为多值 INSERT,否则仍是逐条执行,但executeBatch()返回值逻辑不变。
获取自增主键(Generated Keys)
对于 INSERT 语句,若需返回数据库生成的主键(如 MySQL AUTO_INCREMENT、PostgreSQL SERIAL),不能依赖 executeBatch() 的返回值,而应使用 Statement.RETURN_GENERATED_KEYS 参数创建 PreparedStatement,并在执行后调用 getGeneratedKeys()。
- 必须在创建 PreparedStatement 时指定标志:
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); - 调用
executeBatch()后,再调用getGeneratedKeys()获取ResultSet; - 该 ResultSet 每行对应一条 INSERT 语句生成的键(顺序与
addBatch()一致),通常只有一列(如"id"); - 注意:不是所有驱动都支持批量获取生成键(例如旧版 Oracle 驱动不支持,HikariCP + PostgreSQL 可正常工作)。
使用 JDBC 4.0+ 的 getLargeUpdateCount() 和 getLargeUpdateCounts()
当影响行数可能超过 Integer.MAX_VALUE(极少见),或想统一处理大数值时,可使用 getLargeUpdateCount()(单条语句)或 getLargeUpdateCounts()(批量)替代传统 int 版本。它们返回 long 或 long[],语义一致,兼容性更好。
MyBatis 等框架中的等效处理
若使用 MyBatis:
– SqlSession.insert("xxx", list) 批量插入默认不返回主键;
– 需配合 <selectkey></selectkey> 或 useGeneratedKeys="true" + keyProperty,且仅对单条记录有效;
– 真正批量获取主键需改用 insertSelective 循环 + SELECT LAST_INSERT_ID()(MySQL)或类似机制,或借助数据库特有语法(如 PostgreSQL 的 RETURNING 子句)。
MyBatis-Plus 的 saveBatch() 同样不返回主键;若需,建议用 saveOrUpdateBatch() 配合实体 ID 已设(如 UUID),或自行封装 INSERT ... RETURNING。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











