PrepareStatement 也是接口,PrepareStatement extends Statement,PrepareStatement 本身没有 int[] executeBatch() throws SQLException 方法,而是继承了Statement的方法,且它们都是接口没有实际实现方法,但Statement接口对executeBatch()方法做了规范:
将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。返回数组的int
元素的排序对应于批中的命令,批中的命令根据被添加到批中的顺序排序。方法
executeBatch
返回的数组中的元素可能为以下元素之一:
- 大于等于 0 的数 - 指示成功处理了命令,是给出执行命令所影响数据库中行数的更新计数
-
SUCCESS_NO_INFO
的值 - 指示成功执行了命令,但受影响的行数是未知的如果批量更新中的命令之一无法正确执行,则此方法抛出
BatchUpdateException
,并且 JDBC 驱动程序可能继续处理批处理中的剩余命令,也可能不执行。无论如何,驱动程序的行为必须与特定的 DBMS 一致,要么始终继续处理命令,要么永远不继续处理命令。如果驱动程序在某一次失败后继续进行处理,则BatchUpdateException.getUpdateCounts
方法返回的数组将包含的元素与批中存在的命令一样多,并且其中至少有一个元素将为: -
EXECUTE_FAILED
的值 - 指示未能成功执行命令,仅当命令失败后驱动程序继续处理命令时出现
所以,判断是否执行成功时,不仅要判断返回值是否 >=0,而且需要判断是否 ==Statement.SUCCESS_NO_INFO
(即:-2)
另外:
如果使用executeBatch()但没有开启手动提交事务,如果你是自动提交事务那么可能会导致批量加入的SQL语句每执行一条就提交一次事务,导致时间全部浪费在这里了。所以可以通过手动提交事务,等executebatch执行了 然后提交事务。conn.setAutoCommit = false;//...............代码conn.commit();以提高代码执行效率。