13.7.3 Java 8增强的批量更新
13.7.3 Java 8增强的批量更新
JDBC
还提供了一个批量更新的功能,使用批量更新时,多条SQL
语句将被作为一批操作被同时收集,并同时提交。
提示
批量更新必须得到底层数据库的支持,可以通过调用DatabaseMetaData
的supportsBatchUpdates()
方法来查看底层数据库是否支持批量更新.
使用批量更新也需要先创建一个Statement
对象,然后利用该对象的add Batcho
方法将多条SQL
语句同时收集起来,最后调用Java 8
为Statement
对象新增的executeLargeBatch()
(或原有的executeBatch())
方法同时执行这些SQL
语句。只要批量操作中任何一条SQL
语句影响的记录条数可能超过Integer.MAX_VALUE
,就应该使用executeLargeBatch()
方法,而不是executeBatch()
方法。
如下代码片段示范了如何执行批量更新。
1 | Statement stmt=conn.createStatement(); |
执行executeLargeBatch()
方法将返回一个long
数组,因为使用Statement
执行DDL
、DML
语句都将返回一个long
值,而执行多条DDL
、DML
语句将会返回多个long
值,多个long
值就组成了这个long
数组。
如果在批量更新的addBatch()
方法中添加了select
査询语句,程序将直接出现错误。
编程要点
为了让批量操作可以正确地处理错误,必须把批量执行的操作视为单个事务,如果批量更新在执行过程中失败,则让事务回滚到批量操作开始之前的状态。
为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式。如下代码片段所示:
1 | //1.保存当前的自动的提交模式 |
注意MySQL
的最新驱动程序依然不支持executeLargeBatch()
方法,对于数据库驱动不支持executeLargeBatch()
的情形,则只能依然使用传统的executeBatch()
方法