JDBCのパラメータ化バッチ更新とは?仕組みと実装例をわかりやすく解説
複数のINSERT文やUPDATE文、DELETE文(更新件数を返すSQL文)をひとつのグループにまとめて一括実行する仕組みを「バッチ更新」と呼びます。
パラメータ(プレースホルダ)を含むクエリをバッチ更新として渡す場合、これを「パラメータ化バッチ更新」といいます。
一般的に、バッチ更新を行うにはaddBatch()メソッドで必要なステートメントをすべて追加し、executeBatch()メソッドで一括実行します。以下はその基本的な例です。
// Statementオブジェクトの生成
Statement stmt = con.createStatement();
// オートコミットを無効化
con.setAutoCommit(false);
// ステートメントをバッチに追加
stmt.addBatch("INSERT INTO Sales VALUES ('KeyBoard', 'Amith', 'January', 1000, 'Hyderabad')");
stmt.addBatch("INSERT INTO Sales VALUES ('Earphones', 'SUMITH', 'March', 500, 'Vishakhapatnam')");
stmt.addBatch("INSERT INTO Sales VALUES ('Mouse', 'Sudha', 'September', 200, 'Vijayawada')");
// バッチの実行
stmt.executeBatch();
上記のコードでは、SQL文の大部分が何度も繰り返し記述されています。このようなケースでは、PreparedStatementを使ってプレースホルダ(?)を含むクエリを1回だけ定義し、セッターメソッドで値を渡す「パラメータ化バッチ更新」の方が効率的で可読性も高くなります。
値を設定する際は、各レコード分の値をaddBatch()メソッドで順次バッチに追加していき、最後にまとめて実行します。
パラメータ化バッチ更新の作成手順
パラメータ化バッチ更新を作成するには、まずプレースホルダ(?)を含むINSERT・UPDATE・DELETE用のPreparedStatementを準備します。
次に、setXXX()系メソッド(setString()、setInt()など)を使って各プレースホルダに値を設定します。その後、各レコード分の値をaddBatch()メソッドでバッチに追加し、最後にexecuteBatch()メソッドでバッチを一括実行します。
注意: ステートメントをバッチに追加する前に、con.setAutoCommit(false)でオートコミットを無効にしておく必要があります。また、バッチ実行後はcon.commit()メソッドを呼び出して変更を確定(保存)してください。
実行例
ここでは、データベースに以下の構造を持つ「Sales」テーブルが作成されているものとします。
+-------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------+------+-----+---------+-------+ | Product_Name | varchar(255) | YES | | NULL | | | Name_Of_Customer | varchar(255) | YES | | NULL | | | Month_Of_Dispatch | varchar(255) | YES | | NULL | | | Price | int(11) | YES | | NULL | | | Location | varchar(255) | YES | | NULL | | +-------------------+--------------+------+-----+---------+-------+
この例では、パラメータ化バッチ更新を使って、上記のテーブルに複数のレコードを一括挿入します。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class ParameterizedBatchUpdate {
public static void main(String args[])throws Exception {
// 接続の取得
String mysqlUrl = "jdbc:mysql://localhost/testDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// Statementオブジェクトの生成
Statement stmt = con.createStatement();
// オートコミットを無効化
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement("INSERT INTO Sales VALUES (?, ?, ?, ?, ?)");
pstmt.setString(1, "KeyBoard");
pstmt.setString(2, "Amith");
pstmt.setString(3, "January");
pstmt.setInt(4, 1000);
pstmt.setString(5, "Hyderabad");
pstmt.addBatch();
pstmt.setString(1, "Earphones");
pstmt.setString(2, "Sumith");
pstmt.setString(3, "March");
pstmt.setInt(4, 500);
pstmt.setString(5, "Vishakhapatnam");
pstmt.addBatch();
pstmt.setString(1, "Mouse");
pstmt.setString(2, "Sudha");
pstmt.setString(3, "September");
pstmt.setInt(4, 500);
pstmt.setString(5, "Vishakhapatnam");
pstmt.addBatch();
// バッチの実行
pstmt.executeBatch();
// 変更の保存
con.commit();
System.out.println("Records inserted......");
}
}
実行結果
Connection established...... Records inserted......
-
具体例でわかる!C言語のvolatile型修飾子とrestrict型修飾子の使い方
型修飾子とは、C言語において既存のデータ型に特別な属性を付与するキーワードのことです。C言語には「const」「volatile」「restrict」の3種類の型修飾子が存在します。本記事では、このうちvolatileとrestrictについて、具体例を交えながらわかりやすく解説します。 volatile型修飾子とは volatile型修飾子は、「その変数が共有されている」ことをコンパイラに伝えるために使用します。つまり、変数をvolatile付きで宣言すると、その変数は他のプログラムやハードウェアなどの外部要因によって参照・変更される可能性があることを意味します。これにより、コンパイラはその
-
画像配列(イメージアレイ)とは?OpenCVとC++のサンプルコードでわかりやすく解説
配列(アレイ)とは、複数のデータをまとめて効率的に格納し、取り出すための便利な仕組みです。OpenCVでは、この配列の概念を活用することで、複数の画像をひとつの「画像配列」に読み込み、インデックス番号を指定するだけで目的の画像を表示できます。 本記事では、Mat型の行列配列に複数の画像を読み込み、インデックス番号を使って各画像を表示するC++のサンプルプログラムを紹介します。 画像配列の基本的な考え方 通常、1枚の画像を読み込む場合はMatオブジェクトを1つ宣言すれば十分ですが、複数の画像を扱いたい場合には、Mat型の配列を宣言することで管理が簡単になります。配列の各要素にはimread()関