
「PreparedStatement」は、「Statementインターフェイス」のサブインターフェイスになり、文字通り「準備されたSQLを発行するインターフェイス」になります。
準備されたSQLとは、プリコンパイル(既にコンパイル済み)のSQLのことを指します。
Statementとの違いは?
メリット
パフォーマンスの向上が期待できる。
下記の性質により、パフォーマンスの向上が期待できます。
- 既にコンパイルされたSQLを発行することになる。
- 前回利用した際のキャッシュを再利用することで、データベースの処理スピードが上がる。
ただし、Webアプリケーションの場合は、リクエストの度にConnectionを閉じてしまい、PreparedStatementも破棄してしまいますので、キャッシュがクリアされてしまいあまり大きな恩恵を受けることができません。ただ、アプリケーションサーバーによっては、Connectionを閉じても、PreparedStatementを閉じないものもあります。
SQLインジェクションに強く、楽。
SQLにパラメータを埋め込む際に、自動的にエスケープしてくれるので、プログラマでエスケープ処理を書く必要がありません。
デメリット
メンテがしずらい。
数値を指定して、動的にパラメータを埋め込むので、動的にSQLを作成する場合等は、後でメンテがしずらくなってしまいます。
PreparedStatementでINSERT文を発行するサンプル
package oracletest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class OracleInsert { public static void main(String[] args) throws Exception { Connection con = null; PreparedStatement presmt = null; ResultSet rs = null; //ホスト名 String hostname = "localhost"; //SID String sid = "orcl"; //ユーザー名 String username = "orauser"; //パスワード String passwd = "orapass"; //SQL String sql = "INSERT INTO USER_MASTER VALUES (?,?,?)"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection( "jdbc:oracle:thin:@" + hostname + ":1521:" + sid,username,passwd); presmt = con.prepareStatement(sql); presmt.setString(1,"0023"); presmt.setString(2,"1002"); presmt.setString(3,"田中太郎"); presmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } presmt.close(); con.close(); } }
ポイント
String sql = "INSERT INTO USER_MASTER VALUES (?,?,?)"; presmt = con.prepareStatement(sql); presmt.setString(1,"0023"); presmt.setString(2,"1002"); presmt.setString(3,"田中太郎");
上記の「?」という記述は、「パラメータ変数」と呼びます。「パラメータ変数」に対して、?の番地に値を代入しています。この際に自動に変数のエスケープもしてくれるので、SQLインジェクションにも強くなります。
この記事へのコメントはありません。