ファイヤープロジェクト
PreparedStatement
2004-05-17T22:20+09:00   matsu
一部のフィールドの値が異なるだけのSQL文なら,構文解析などを省略して高速化できたりする(といっても,たぶんドライバ次第).このようなSQL文んはStatementのサブインタフェースPreparedStatementの実装クラスで表現される.
ConnectionからStatementオブジェクトを取得する方法は,DBサーバへ要求を発行するたびにSQL文の解析が行われるものであった.構文が同じで一部のフィールドの値指定だけが異なるようなSQL文を何度も発行する場合,これでは効率が悪い.本頁の記述対象となる処理のイメージは埋め込みSQLの
EXEC SQL PREPARE ...
と同じである.Prepare対象はSQL文のいわば雛型で,パラメータ化される部分を?で表現する.例えばsampleTableからfield1とfield2の値を指定してSELECTする場合,以下のような雛型を用意する.
SELECT * FROM sampleTable WHERE field1 = ? AND field2 = ?;
このSQLをプリコンパイルし,?の部分を変更,設定するだけでDBサーバへの要求をできようにできる.これによって処理の効率化,高速化ができる.
前節の?を含むSQL文からプリコンパイルされたSQL文は,PreparedStatementオブジェクトに格納される.これはPreparedStatementはStatementのサブクラスである.PreparedStatementを使用したサンプルを以下に示す.
このサンプルの焦点はdoTransactionメソッドで,ここでは以下の処理を行う.
  1. PreparedStatementオブジェクトの作成
  2. パラメータのクリア/設定
  3. 要求発行
  4. PreparesStatementオブジェクトのclose
これを実行してみる.
$> java PrepareSample jdbc:postgresql://dbserver/firstdb matsu hogefuga 
Connect to jdbc:postgresql://dbserver/firstdb
User : matsu Pwd : hogefuga
Execute SQL : CREATE TABLE jdbcsample (id INTEGER PRIMARY KEY, value TEXT);
Execute SQL : SELECT count(*) AS record_count from jdbcsample
Got record : count = 1000
Execute SQL : DROP TABLE jdbcsample
サンプルではPreparedStatementオブジェクトの作成は以下で行っている.
String sqlInsert = "INSERT INTO jdbcsample VALUES (?, ?)";
PreparedStatement preparedInsertStatement =
  dbConnection.prepareStatement (sqlInsert);
?を含むSQL文の文字列をConnectionオブジェクトのprepareStatementメソッドに渡すことで取得している.PreparedStatementオブジェクトはStatementオブジェクトと同様,不要になったらcloseメソッドで開放するのが行儀がよい.
preparedInsertStatement.close ();
PrepareStatementオブジェクトにはパラメータがあり,値を設定できる.サンプルでは以下で全てのパラメータの設定値を即座にクリアしている(※).
// パラメータのクリア
preparedInsertStatement.clearParameters ();
サンプルではこのようにあらかじめパラメータ値をクリアしておいてから,値を設定した.
preparedInsertStatement.setInt (1, i * 10);
preparedInsertStatement.setString (2, "Value" + i);
メソッド名はsetXXXというパターンである.XXXはフィールドに応じた型の名前である.そして第一引数は何番目の?か(1から始まる),第二引数は?に入る値である.パラメータ値を設定したら発行する.サンプルでは以下の部分である.
preparedInsertStatement.executeUpdate ();
サンプルではINSERTだったのでexecuteUpdateだったが,要求発行メソッドは要求に応じてexecuteQuery,executeもある.
※ サンプルのパターンではこの処理は必要ない.ちょっと使ってみたかっただけ.パラメータ値は設定したら要求発行後も残るが,さらにsetXXXすることで上書き設定される.設定値のオブジェクト次第では即座にクリア(=設定値の開放)ができるclearParametersメソッドが便利な場合がありうるかもしれない.
matsu(C)
Since 2002
Mail to matsu