目次へ

2.3. バッチ処理

複数の更新処理(insert, update, delete)をまとめて実行する機能が、「java.sql.Statement」および「java.sql.PreparedStatement」には提供されています。

 import java.sql.*;
  
 public class BatchSample{
   public static void main(String args[]) throws ClassNotFoundException,SQLException{
     Class.forName("org.postgresql.Driver");
     Connection connection=DriverManager.getConnection("jdbc:postgresql:Training","postgres","");

     Statement statamenet=connection.createStatement();
     statement.addBatch("insert into product values(101,'Viz','compact car',100);");
    statement.addBatch("update product set price=price*0.9 where price>=300;");
    statement.addBatch("delete from product where p_num='111';");
    int result[]=statement.executeBatch();

    for(int i=0;i<result.length;i++){
      System.out.println("result"+i+": "+result[i]);
    }
  }
}

「Statement」オブジェクトの生成までは同じです。9行目から11行目、「addBatch」メソッドでバッチ処理を行いたいSQL文を順に指定していきます。最後に「executeBatch」メソッドで指定されたバッチ処理を実行します(12行目)。「executeBatch」メソッドは返り値として、int型の配列を返します。配列にはバッチ処理で実行された、各SQL文の実行結果が格納されています。0以上の場合は、SQL文の実行によって更新された行数、-2の場合は正常終了したものの更新された行数がわからない、-3の場合は処理に失敗した事を示しています。

ここで注意しなければならないのは、バッチ更新が必ずしも「トランザクション処理」とは限らないという点です。トランザクション処理については次章で説明しますが、このサンプルプログラムの場合はトランザクション処理とはなっていません。「executeUpdate」は処理途中でエラーが発生すると「java.sql.BatchUpdateException」例外を発生します。しかし例外が発生しても、それまでに実行されたSQL文については、結果がデータベースに反映されてしまいます。

最後に「PreparedStatement」を使用した場合のバッチ処理を説明します。8行目以降を記述しています。

     String sql="insert into product values(?,?,?,?);";
     PreparedStatement statement=connection.createStatement(sql);
    statement.setInt(1,101);
    statement.setString(2,"Viz");
    statement.setString(3,"compact car");
    statement.setInt(4,100);
    statement.addBatch();

    statement.setInt(1,107);
    statement.setString(2,"Fan Ca Go");
    statement.setString(3,"compact car");
    statement.setInt(4,150);
    statement.addBatch();

    sql="delete product where price>=400";
    statement.addBatch(sql);
    int result[]=statement.executeBatch();

    for(int i=0;i<result.length;i++){
      System.out.println("result"+i+": "+result[i]);
    }
  }
}

「PreparedStatement」の場合は、値をセットしてから(10〜13行目)、「addBatch」メソッドで追加します。この時点でSQL文ができているので引数は必要ありません。繰り返す事により(16〜20行目)、同じようなSQL文をバッチ処理リストに追加していく事ができます。

また「PreparedStatement」は「Statement」クラスを拡張したクラスなので、「Statement」クラスと同じような使用(22〜23行目)の仕方もできます。ただし複数の「PreparedStatement」オブジェクトを組み合わせて1つのバッチ処理を作り上げる事はできません。

(実習課題3)

実習課題2のプログラムを更に改良しなさい。

  • テーブル内のデータ更新をバッチ処理で行うようにする事。
  • 行の追加機能を追加する事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp