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

Javaで大量データを登録/更新するサンプルです。
サンプルでは、XAMPPのMySQL(MariaDB)へ更新しています。

確認環境
・XAMPP 7.1.8
・Windows 10

目次

バッチ更新

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

Statementでのバッチ更新

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

17,18行目は、SQL文です。
26,27行目は、addBatchメソッドでバッチ登録しています。
29行目は、executeBatchメソッドで実行処理をしています。executeBatchメソッドの戻り値は、更新カウントの配列を返します。配列の1つの要素は1つのSQLで何件更新したかを表します。
サンプルでは以下のように出力されます。
1つ目のSQLの更新件数は、1件です
2つ目のSQLの更新件数は、1件です
20,21,25行目は、try-with-resources構文です。リソースを自動でクローズします。

package test1;

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

/**
 *  java - mysql
 */
class Sample {

    void runSample(){

        String url = "jdbc:mysql://localhost:3306/testphp";
        String user = "root";
        String pass = "";
        String SQL1 = "insert into fish (name,romaji) VALUES ('かれい','karei')";
        String SQL2 = "insert into fish (name,romaji) VALUES ('ひらめ','hirame')";
        
        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=0;i<cnt.length;i++){
                    System.out.println
                ((i+1) + "つ目のSQLの更新件数は、"+ cnt[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();
    }
}

PreparedStatementでのバッチ更新

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

17行目は、SQL文です。値の箇所はプレースホルダ(?)になっています。
25,26,29,30行目は、プレースホルダに値をセットしています。1つめの引数はプレースホルダの位置です。2つめの引数は値です。
27,31行目は、addBatchメソッドでバッチ登録しています。
33行目は、executeBatchメソッドで実行処理をしています。executeBatchメソッドの戻り値は、更新カウントの配列を返します。配列の1つの要素は1つのSQLで何件更新したかを表します。
サンプルでは以下のように出力されます。
1つ目のSQLの更新件数は、1件です
2つ目のSQLの更新件数は、1件です
19,20,24行目は、try-with-resources構文です。リソースを自動でクローズします。

package test1;

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

/**
 *  java - mysql
 */
class Sample {

    void runSample(){

        String url = "jdbc:mysql://localhost:3306/testphp";
        String user = "root";
        String pass = "";
        String SQL = "insert into fish (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,"aji");
                ps.addBatch();
                
                ps.setString(1,"たい");
                ps.setString(2,"tai");
                ps.addBatch();
                
                int[] cnt = ps.executeBatch();
                conn.commit();
                for(int i=0;i<cnt.length;i++){
                    System.out.println
                ((i+1) + "つ目のSQLの更新件数は、"+ cnt[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();
    }
}

リンク

以下は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でDB作成からデータ取得までのサンプル
Java MySQLにJDBC接続してselectするサンプル
Java MySQLにJDBC接続してinsert/update/deleteするサンプル

 はまったらエンジニア特化型Q&Aサイト
【teratail(テラテイル)】で質問しましょう!


△上に戻る