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
関連の記事
XAMPPをインストールする手順(Windows10)
XAMPP phpMyAdminでデータベースを作成する手順
XAMPP phpMyAdminでテーブルを作成する手順
Java MySQLにJDBC接続してselectするサンプル
Java MySQLにJDBC接続してinsert/update/deleteするサンプル