PreparedStatement
一部のフィールドの値が異なるだけの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メソッドで,ここでは以下の処理を行う.
- PreparedStatementオブジェクトの作成
- パラメータのクリア/設定
- 要求発行
- 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メソッドが便利な場合がありうるかもしれない.

