Statement, PreparedStatement, CallableStatement对象都可以用来进行成批更新。
一、成批更新所使用的对象
1、Statement对象
成批更新功能允许一个Statement对象一起提交一个不同种类的更新命令作为一个单元或是一个批处理来执行。当一个Statement对象创建的时候,与之相连的批处理命令为空,程序可以使用Statement.addBatch方法为这个Statement的批处理加入命令,并且加入相应的SQL更新语句,所有被加入的更新命令的返回值都必须是一个更新数。如果一个程序不想提交已经为Statement加入的更新命令,可以调用Statement.clearBatch方法来清除这些更新命令。
//Statement对象的批处理程序代码
conn.setAutoCommit(false);
Statement stmt=conn.createStatement();
stmt.addBatch ( "insert into employees values (1000, ' Joe Jones') " );
stmt.addBatch ( " insert into departments values ( 260, ' Shoe ' ) " );
stmt.addBatch ( " insert into emp_dept values ( 1000, 260 ) " );
int[] updateCounts = stmt.ExecuteBatch();
Statement.ExecuteBatch向数据源提交了一系列的命令要求批量处理,这些命令会按被加到这个批处理中的顺序执行,当所有命令都成功完成后,ExecuteBatch就会返回一个整数数组,这个数组的每个元素都是对应着相应命令在批处理组中的条目。
只有返回一个简单的更新数的DDL和DML命令可以被用于批处理执行,如果一个命令想返回一个ResultSet对象,ExecuteBatch会抛出一个BatchUpdateException的例外。当这个例外产生后,应用程序可以调用BatchUpdateException.getUpdateCounts来获得一个描述例外起因的更新数组。
二、PreparedStatement对象
当使用PreparedStatement时,在一个批处理组中的命令通常包含一个参数化的SQL语句和一个相联系的参数集合。
//PreparedStatement对象的批处理程序
conn.setAutoCommit (false);
PreparedStatement stmt = conn.prepareStatement ( " insert into employees values ( ? , ? )");
stmt.setInt ( 1, 2000 );
stmt.setString ( 2, "Kelly ");
stmt.addBatch ();
stmt.setInt ( 1, 3000 );
stmt.setString (2, "Bill ");
stmt.addBatch ();
int[] updateCounts = stmt.ExecuteBatch ():

三、CallableStatement对象
CallableStatement的批处理更新方法和PreparedStatement相似。
一个批处理的存储过程不可以有OUT或INOUT参数,如果违反这个限制,CallableStatement.ExecuteBatch方法就会抛出一个例外。
//PreparedStatement对象的批处理程序
CallableStatement cstmt = conn.prepareCall ( " { call updatePrice ( ?, ? ) } ");
cstmt.setString ( 1, " Colombian ");
cstmt.setFloat (2, 8.49f);
cstmt.addBatch();
cstmt.setString (1, "Decaf");
cstmt.setFloat (2, 9.49f);
cstmt.addBatch ();
int[] updateCounts = cstmt.ExecuteBatch();