JDBC PreparedStatementの例 – バッチ更新
ここでは、JDBCの `PreparedStatement`を使用してバッチ処理で少数のレコードを挿入する方法を示します。
dbConnection.setAutoCommit(false);//commit trasaction manually String insertTableSQL = "INSERT INTO DBUSER" + "(USER__ID, USERNAME, CREATED__BY, CREATED__DATE) VALUES" + "(?,?,?,?)"; PreparedStatement = dbConnection.prepareStatement(insertTableSQL); preparedStatement.setInt(1, 101); preparedStatement.setString(2, "mkyong101"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.setInt(1, 102); preparedStatement.setString(2, "mkyong102"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.executeBatch(); dbConnection.commit();
__完全なJDBCバッチ更新の例を参照してください。
package com.mkyong.jdbc; import java.sql.DriverManager; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class JDBCBatchUpdateExample { private static final String DB__DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String DB__CONNECTION = "jdbc:oracle:thin:@localhost:1521:MKYONG"; private static final String DB__USER = "user"; private static final String DB__PASSWORD = "password"; public static void main(String[]argv) { try { batchInsertRecordsIntoTable(); } catch (SQLException e) { System.out.println(e.getMessage()); } } private static void batchInsertRecordsIntoTable() throws SQLException { Connection dbConnection = null; PreparedStatement preparedStatement = null; String insertTableSQL = "INSERT INTO DBUSER" + "(USER__ID, USERNAME, CREATED__BY, CREATED__DATE) VALUES" + "(?,?,?,?)"; try { dbConnection = getDBConnection(); preparedStatement = dbConnection.prepareStatement(insertTableSQL); dbConnection.setAutoCommit(false); preparedStatement.setInt(1, 101); preparedStatement.setString(2, "mkyong101"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.setInt(1, 102); preparedStatement.setString(2, "mkyong102"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.setInt(1, 103); preparedStatement.setString(2, "mkyong103"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.addBatch(); preparedStatement.executeBatch(); dbConnection.commit(); System.out.println("Record is inserted into DBUSER table!"); } catch (SQLException e) { System.out.println(e.getMessage()); dbConnection.rollback(); } finally { if (preparedStatement != null) { preparedStatement.close(); } if (dbConnection != null) { dbConnection.close(); } } } private static Connection getDBConnection() { Connection dbConnection = null; try { Class.forName(DB__DRIVER); } catch (ClassNotFoundException e) { System.out.println(e.getMessage()); } try { dbConnection = DriverManager.getConnection( DB__CONNECTION, DB__USER,DB__PASSWORD); return dbConnection; } catch (SQLException e) { System.out.println(e.getMessage()); } return dbConnection; } private static java.sql.Timestamp getCurrentTimeStamp() { java.util.Date today = new java.util.Date(); return new java.sql.Timestamp(today.getTime()); } }
結果
バッチ更新プロセスを介して3つのレコードがデータベースに挿入されます。
なぜバッチ更新を使用する必要がありますか?
あるいは、通常の `executeUpdate()`メソッドを以下のように使用することができます:
String insertTableSQL = "INSERT INTO DBUSER" + "(USER__ID, USERNAME, CREATED__BY, CREATED__DATE) VALUES" + "(?,?,?,?)"; PreparpreparedStatement = dbConnection.prepareStatement(insertTableSQL); preparedStatement.setInt(1, 111); preparedStatement.setString(2, "mkyong101"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.executeUpdate(); preparedStatement.setInt(1, 112); preparedStatement.setString(2, "mkyong102"); preparedStatement.setString(3, "system"); preparedStatement.setTimestamp(4, getCurrentTimeStamp()); preparedStatement.executeUpdate();
上記のコードスニペットもうまくいきますが、 `executeUpdate()`がデータベースに1回ヒットするため、1000レコードと言うように、多くのレコードを挿入しようとするとパフォーマンスの問題が発生します。バッチ更新プロセスでは、 `executeBatch()`が呼ばれたときにデータベースにヒットします。