Java PreparedStatementインタフェースを使ってSQLを発行する




通常のステートメント(java.sql.Statement)を利用することは、エスケープ処理や脆弱性の観点から、あまり良いとは言えません。
また、複数レコードのINSERT等で、何度も同一のSQLを立て続けに発行するような場合、パラメータだけをクリアすることができるため、とくに効果的です。
(ハードパースを抑制することだけでも、データベースは好感度をアップしてくれますw)

こちらを利用するのが普通ですが、もし、通常のステートメントを使用されている方がいれば、即刻、プリペアードステートメントに切り替えることをお勧めします(; ・`д・´)

PreparedStatementでSQLを発行するサンプル

Oracleではお約束のDUAL表より結果を抽出します。
パラメータを渡すため、無駄にDUMMYカラムを条件に含んでみますw

実行結果

サンプルの解説

Statementで発行した場合と比較すると簡単です。

使い方

Connection#prepareStatement(String)にて、コネクションよりプリペアードステートメントを取得する際に、SQLを渡します。発行時は逆に渡しません。
パラメータは、プリペアードステートメントに対して後からセットするため、渡すSQLには、リテラル(値)の代わりに「?」を書いておきます。
パラメータのセットは、?のインデックスに対して、セットします。インデックスは、1始まりで、前から順番になります。
また、パラメータをセットする際に、エスケープ処理は不要です。

性能

SQLの解析は、プリペアードステートメントを取得する時点で行うようになるため、PreparedStatement#executeQuery()にて、実際にSQLを発行した際の性能が改善されます。
場所が変わっただけのように感じられるかもしれませんが、何度でもパラメータを変えて発行できるため、繰り返し発行するような場合には、速度の違いを体感できますw
なお、繰り返すような場合は、以下のような感じで行います。

PreparedStatementでデータを更新するには?

PreparedStatementでデータを更新する方法は、こちらを見てください。

Java PreparedStatementインタフェースを使ってデータを更新する

2018.02.23