批處理允許您將相關(guān)的SQL語句分組到一個批中,并通過對數(shù)據(jù)庫的一次調(diào)用提交它們。
當您一次將多個SQL語句發(fā)送到數(shù)據(jù)庫時,可以減少通信開銷,從而提高性能。
JDBC 驅(qū)動程序不需要支持這個特性。您應(yīng)該使用 DatabaseMetaData.supportsBatchUpdates ()方法來確定目標數(shù)據(jù)庫是否支持批量更新處理。如果 JDBC 驅(qū)動程序支持此特性,則該方法返回 true。
Statement、 PreparedStatement 和 CallableStatement 的 addBatch ()方法用于向批處理添加單個語句。executeBatch ()用于開始執(zhí)行組合在一起的所有語句。
executeBatch()返回一個整數(shù)數(shù)組,數(shù)組中的每個元素表示相應(yīng)update語句的更新計數(shù)。
正如您可以將語句添加到批處理中進行處理一樣,您也可以使用 clearBatch ()方法刪除它們。此方法刪除所有添加了 addBatch ()方法的語句。但是,不能選擇要刪除的語句。
這是將批處理與Statement對象一起使用的典型步驟序列-
使用這兩種createStatement()方法創(chuàng)建 Statement 對象。
使用 setAutoCommit ()將 auto-commit 設(shè)置為 false。
在創(chuàng)建的語句對象上使用addBatch()方法向批處理中添加任意數(shù)量的SQL語句。
對所創(chuàng)建的語句對象使用 executeBatch ()方法執(zhí)行所有 SQL 語句。
最后,使用commit()方法提交所有更改。
以下代碼段提供了使用Statement對象進行批量更新的示例-
// 創(chuàng)建語句對象 Statement stmt = conn.createStatement(); // 將自動提交設(shè)置為false conn.setAutoCommit(false); // 創(chuàng)建SQL語句 String SQL = "INSERT INTO Employees (id, first, last, age) " + "VALUES(200,'Zia', 'Ali', 30)"; // 在批處理中添加上面的SQL語句。 stmt.addBatch(SQL); // 再創(chuàng)建一條SQL語句 String SQL = "INSERT INTO Employees (id, first, last, age) " + "VALUES(201,'Raj', 'Kumar', 35)"; // 在批處理中添加上面的SQL語句。 stmt.addBatch(SQL); // 再創(chuàng)建一條SQL語句 String SQL = "UPDATE Employees SET age = 35 " + "WHERE id = 100"; // 在批處理中添加上面的SQL語句。 stmt.addBatch(SQL); // 創(chuàng)建一個int []來保存返回的值 int[] count = stmt.executeBatch(); //明確提交語句以應(yīng)用更改 conn.commit();
為了更好地理解,讓我們研究批處理示例代碼。
這是將批處理與PrepareStatement對象一起使用的典型步驟序列-
使用占位符創(chuàng)建SQL語句。
使用任一 PrepareStatement()方法創(chuàng)建PrepareStatement對象。
使用 setAutoCommit ()將 auto-commit 設(shè)置為 false。
在創(chuàng)建的語句對象上使用 addBatch ()方法添加盡可能多的 SQL 語句到批處理中。
對所創(chuàng)建的語句對象使用 executeBatch ()方法執(zhí)行所有 SQL 語句。
最后,使用commit()方法提交所有更改。
以下代碼段提供了使用PrepareStatement對象進行批量更新的示例-
// 創(chuàng)建SQL語句 String SQL = "INSERT INTO Employees (id, first, last, age) " + "VALUES(?, ?, ?, ?)"; // 創(chuàng)建PrepareStatement對象 PreparedStatemen pstmt = conn.prepareStatement(SQL); //將自動提交設(shè)置為false conn.setAutoCommit(false); // 設(shè)置變量 pstmt.setInt( 1, 400 ); pstmt.setString( 2, "Pappu" ); pstmt.setString( 3, "Singh" ); pstmt.setInt( 4, 33 ); // 將其添加到批 pstmt.addBatch(); // 設(shè)置變量 pstmt.setInt( 1, 401 ); pstmt.setString( 2, "Pawan" ); pstmt.setString( 3, "Singh" ); pstmt.setInt( 4, 31 ); // 將其添加到批 pstmt.addBatch(); //添加更多批 . . . . //創(chuàng)建一個int []來保存返回的值 int[] count = stmt.executeBatch(); //明確提交語句以應(yīng)用更改 conn.commit();
為了更好地理解,讓我們研究批處理示例代碼。