目次 | 前の項目 | 次の項目 | JDBCTM ガイド: 入門 |
Statement
、PreparedStatement
、CallableStatement
の各オブジェクトが使用できます。
Statement
オブジェクトで、基盤となる DBMS に、異なる一連の更新コマンドを一括して (バッチとして) 送ることができます。次の例では、新入社員を架空の会社のデータベースに追加するために必要な一連の更新操作文を、1 つのバッチとして送っています。
この例では、// turn off autocommit con.setAutoCommit(false); Statement stmt = con.createStatement(); stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')"); stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')"); stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)"); // submit a batch of update commands for execution int[] updateCounts = stmt.executeBatch();
Statement.executeBatch()
が呼び出されたときに JDBC がトランザクションをコミットしないように、自動コミットモードを無効にしています。自動コミットを無効にすることで、エラーが発生した場合や、バッチ中の一部のコマンドの実行に失敗した場合に、トランザクションをコミットするかどうかをアプリケーション側で制御できるようになります。このような理由から、通常は、バッチ更新が終了した時点で自動コミットをオフにしておくべきです。
JDBC 2.0 の Statement
オブジェクトには、まとめて送ることができるコマンドのリストを管理する機能があります。文の作成時点では、そのコマンドのリストは空です。コマンドのリストに要素を追加するには、Statement.addBatch()
メソッドを使用します。バッチに結果セットを取得するコマンドが含まれている場合、Statement.executeBatch()
を呼び出すと、SQLException
がスローされます。バッチで実行できるのは、更新数だけを返す DLL コマンドと DML コマンドだけです。作成したコマンドのバッチを送るのを中止したい場合は、Statement.clearBatch()
メソッド (上のコードにはない) を呼び出せばバッチを取り消すことができます。
Statement.executeBatch()
メソッドを呼び出すと、基盤となる DBMS にコマンドのバッチが送られ、実行されます。コマンドは、バッチに追加された順序で実行されます。ExecuteBatch()
は、実行されたコマンドによる更新数が含まれた配列を返します。この配列にはバッチ内のコマンドごとに 1 つのエントリが含まれており、要素はコマンドが実行された順序 (バッチに追加された順序と同じ) に並んでいます。executeBatch()
を呼び出すと、Statement
オブジェクトの現在の結果セットが開かれていれば、それが閉じられます。文が保持しているバッチコマンドの内部リストは、executeBatch()
の実行が終了すると、空の状態にリセットされます。
バッチ中のコマンドの実行に失敗すると、executeBatch()
は BatchUpdateException
をスローします。BatchUpdateException.getUpdateCounts()
メソッドを使用すると、実行に成功したコマンドによる更新数が含まれた整数型配列を取得できます。Statement.executeBatch()
は、最初のコマンドがエラーを返すと実行が中断され、また、コマンドが実行される順序はコマンドがバッチに追加された順序なので、BatchUpdateException.getUpdateCounts()
が返した配列の要素数が N 個であれば、バッチ中の最初の N 個のコマンドが実行に成功したということになります。
PreparedStatement
オブジェクトに複数の入力パラメータ値のセットを関連付けることができます。これにより、パラメータ値のセットを、パラメータをとる形式の更新コマンドと一緒に、基盤となる DBMS エンジンにまとめて送ることができます。
下の例では、2 人の新入社員のレコードを 1 回のバッチ処理でデータベースに追加しています。各パラメータセット (社員ごとに 1 つ) の作成は PreparedStatement.setXXX()
で行い、現在のバッチへのパラメータセットの追加は PreparedStatement.addBatch()
メソッドで行なっています。
最後に、// turn off autocommit con.setAutoCommit(false); PreparedStatement stmt = con.prepareStatement( "INSERT INTO employees VALUES (?, ?)"); stmt.setInt(1, 2000); stmt.setString(2, "Kelly Kaufmann"); stmt.addBatch(); stmt.setInt(1, 3000); stmt.setString(2, "Bill Barnes"); stmt.addBatch(); // submit the batch for execution int[] updateCounts = stmt.executeBatch();
PreparedStatement.executeBatch()
で更新内容を DBMS に送っています。PreparedStatement
オブジェクトの場合のエラー処理は、Statement
オブジェクトの場合と同じようにして行います。
PreparedStatement
オブジェクトと同じように CallableStatement
オブジェクトも使用できます。複数の入力パラメータ値のセットを 1 つの CallableStatement に関連付け、まとめて DBMS に送ることができます。CallableStatement を使用したバッチ更新機能で呼び出されるストアドプロシージャは、更新数を返すものでなければなりません。また、このようなストアドプロシージャでは、OUT パラメータと INOUT パラメータは使用できません。この規則に反した場合は、CallableStatement.executeBatch()
は例外をスローします。