Java 大量データを登録/更新するサンプル(addBatchメソッド)

Javaで大量データを登録/更新するサンプルです。
EclipseからXAMPPのMySQLに接続します。

確認環境
・Windows10
・Eclipse 4.7
・XAMPP 7.2.8

目次

バッチ更新

  • 複数の更新のSQL文をまとめて(バッチとして)DBに送信する方法です。
  • 更新のSQL文を 1 つ 1 つ送るよりパフォーマンスが向上します。
  • 大量データを登録/更新するときに使用します。
  • バッチ更新は、StatementまたはPreparedStatementまたはCallableStatementのオブジェクトを使用できます。
  • 以下は、Oracleのバッチ更新のページのリンクです。
    https://docs.oracle.com/javase/jp/1.3/guide/jdbc/spec2/jdbc2.1.frame6.html

Statementでのバッチ更新

Statementでのバッチ更新のサンプルです。

package test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

class Sample {
    void runSample(){
        String url 
        = "jdbc:mysql://localhost:3306/testphp?serverTimezone=JST";
        String user = "root";
        String pass = "";
        String SQL1 
        = "insert into syain (name,romaji) VALUES ('鈴木','suzuki')";
        String SQL2 
        = "insert into syain (name,romaji) VALUES ('田中','tanaka')";
        
        try(Connection conn = 
                DriverManager.getConnection(url, user, pass)){

            conn.setAutoCommit(false);
            
            try(Statement stmt = conn.createStatement()){
                stmt.addBatch(SQL1);
                stmt.addBatch(SQL2);
                                
                int[] cnt = stmt.executeBatch();
                conn.commit();
                for (int i: cnt){
                    System.out.println
                ("SQLの更新件数は、"+ i + "件です");
                }
                
            } catch (Exception e) {
                conn.rollback();
                System.out.println("rollback");
                throw e;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            System.out.println("処理が完了しました");
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        Sample s = new Sample();
        s.runSample();
    }
}

22行目は、createStatementメソッドでStatementオブジェクトを生成しています。
23,24行目は、addBatchメソッドでバッチ登録しています。
26行目は、executeBatchメソッドで実行処理をしています。executeBatchメソッドの戻り値は、更新カウントの配列を返します。配列の1つの要素は1つのSQLで何件更新したかを表します。

サンプルでは以下のように出力されます。
SQLの更新件数は、1件です
SQLの更新件数は、1件です
処理が完了しました
17,18,22行目は、try-with-resources構文です。リソースを自動でクローズします。

 

PreparedStatementでのバッチ更新

PreparedStatementでのバッチ更新のサンプルです。

package test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

class Sample {
    void runSample(){
        String url 
        = "jdbc:mysql://localhost:3306/testphp?serverTimezone=JST";
        String user = "root";
        String pass = "";
        String SQL = "insert into syain (name,romaji) VALUES (?,?)";
        
        try(Connection conn = 
                DriverManager.getConnection(url, user, pass)){

            conn.setAutoCommit(false);
            
            try(PreparedStatement ps = conn.prepareStatement(SQL)){
                ps.setString(1,"鈴木");
                ps.setString(2,"suzuki");
                ps.addBatch();
                
                ps.setString(1,"田中");
                ps.setString(2,"tanaka");
                ps.addBatch();
                
                int[] cnt = ps.executeBatch();
                conn.commit();
                for (int i: cnt){
                    System.out.println
                ("SQLの更新件数は、"+ i + "件です");
                }
                
            } catch (Exception e) {
                conn.rollback();
                System.out.println("rollback");
                throw e;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            System.out.println("処理が完了しました");
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        Sample s = new Sample();
        s.runSample();
    }
}

12行目は、SQL文です。値の箇所はプレースホルダ(?)になっています。
19行目は、prepareStatementメソッドでPreparedStatementオブジェクトを生成してます。
20,21,24,25行目は、プレースホルダに値をセットしています。1つめの引数はプレースホルダの位置です。2つめの引数は値です。
22,26行目は、addBatchメソッドでバッチ登録しています。
28行目は、executeBatchメソッドで実行処理をしています。executeBatchメソッドの戻り値は、更新カウントの配列を返します。配列の1つの要素は1つのSQLで何件更新したかを表します。

サンプルでは以下のように出力されます。
SQLの更新件数は、1件です
SQLの更新件数は、1件です
処理が完了しました
19,20,24行目は、try-with-resources構文です。リソースを自動でクローズします。

 

リンク

以下はJava8 API仕様のStatementインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Statement.html

以下はJava8 API仕様のPreparedStatementインターフェースのリンクです。https://docs.oracle.com/javase/jp/8/docs/api/java/sql/PreparedStatement.html

関連の記事

ローカルにPHPが動く環境を作る手順(XAMPP)
XAMPP phpMyAdminでデータベースを作成する手順
XAMPP phpMyAdminでテーブルを作成する手順
Java MySQLにJDBC接続してselectするサンプル
Java MySQLにJDBC接続してinsert/update/deleteするサンプル

プログラムでつまったらteratailに登録して質問しましょう!↓↓↓

△上に戻る