executeBatch()返回int[]数组,每个元素对应addBatch()中第N条语句的执行结果:正整数为影响行数,-2(SUCCESS_NO_INFO)表示成功但无行数,-3(EXECUTE_FAILED)表示执行失败。

Java 中通过 JDBC 批处理执行多条 SQL 语句后,executeBatch() 方法会返回一个 int[] 数组,这个数组就是每条语句执行状态的核心依据。
理解 executeBatch() 的返回值含义
返回的 int 数组中,每个元素对应 addBatch() 添加的第 N 条语句的执行结果,取值有三种情况:
- 正整数:表示该语句影响的行数(如 INSERT 1 行、UPDATE 匹配并修改了 3 行);
- Statement.SUCCESS_NO_INFO(值为 -2):语句执行成功,但数据库无法或未提供影响行数;
- Statement.EXECUTE_FAILED(值为 -3):该语句执行失败(注意:不是所有驱动都严格返回此值,部分驱动可能直接抛出 BatchUpdateException)。
捕获并解析批处理执行结果
必须用 try-catch 包裹 executeBatch(),因为即使部分语句失败,也可能抛出 BatchUpdateException。该异常对象本身也携带了部分成功的结果数组(getUpdateCounts()):
- 若未抛异常 → 直接用返回的 int[] 数组逐项判断;
- 若抛出 BatchUpdateException → 调用其
e.getUpdateCounts()获取已执行语句的状态数组(长度 ≤ 总条数),未执行的语句不包含在内。
实用统计逻辑示例
以下代码片段展示了如何统计成功、失败、无信息的语句数量,并定位具体哪几条出错:
String sql = "INSERT INTO users(name) VALUES (?)";try (PreparedStatement ps = conn.prepareStatement(sql)) {
conn.setAutoCommit(false);
for (String name : names) {
ps.setString(1, name);
ps.addBatch();
}
int[] results = ps.executeBatch(); // 正常执行
int success = 0, failed = 0, noInfo = 0;
for (int i = 0; i if (results[i] > 0) success++;
else if (results[i] == Statement.SUCCESS_NO_INFO) noInfo++;
else if (results[i] == Statement.EXECUTE_FAILED) failed++;
}
System.out.printf("共 %d 条,成功:%d,无信息:%d,失败:%d%n", results.length, success, noInfo, failed);
conn.commit();
} catch (BatchUpdateException e) {
int[] partial = e.getUpdateCounts();
System.out.println("发生部分失败,已执行 " + partial.length + " 条");
// 同样遍历 partial 统计状态
conn.rollback();
}
注意事项与常见误区
- MySQL 驱动默认不真正合并多条 INSERT,需在连接 URL 加
?rewriteBatchedStatements=true,否则 executeBatch() 返回的仍是单条执行效果,性能无提升; - 不要仅靠“是否抛异常”判断整体成败——BatchUpdateException 可能只代表最后一条失败,前面的可能已成功写入(尤其未关闭自动提交时);
- 某些数据库(如 PostgreSQL)支持继续执行后续语句,而 MySQL 默认遇到一条失败就中断整个批次(取决于驱动配置和 SQL_MODE);
- 统计时建议同时记录下标索引,便于排查第几条数据导致失败(例如关联原始数据列表)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











