Edited at

JavaでPreparedStatementを使用する

More than 1 year has passed since last update.

DB接続の必要なバッチやアプリケーションでは、大抵の場合下記クラスを用いて接続の処理を実装します。

- java.sql.Connectionクラス

- java.sql.Statementクラス

- java.sql.ResultSetクラス

しかし最近では、Statementクラスを用いずにjava.sql.PreparedStatementクラスを使用することがポピュラーのようです。

その理由を記しておきます。


理由


  1. SQLインジェクション対策になる

  2. 名前の通り、SQLがDBにキャッシュされるため、繰り返し同じSQL文を発行する場合に処理速度が速くなる。


使い方

Statementクラスと比較した使い方です。


Statementクラスの場合


  1. Statementクラスのオブジェクトを取得する。
    Connectionクラスのオブジェクト.createStatement()で取得できます。

  2. Statementクラスのオブジェクトを用いて、SQL文を実行する。
    Statementクラスのオブジェクト.execute()で実行できます。

Connection con = DriverManager(hoge,hoge,hoge);

String sql = "select name from hogeData where id = '1'";
Statement st = con.createStatement(sql);
st.execute();


PreparedStatementクラスの場合


  1. 実行したいSQL文の値を?に置き換えておきます。その際、シングルクオートで囲む必要はありません。

  2. PreparedStaetmentクラスのオブジェクトを取得する。
    Connectionクラスのオブジェクト.preparedStatement()で取得できます。引数でSQL文も渡しておきます。

  3. PreparedStatementクラスのオブジェクト.setHoge()で、?に値を挿入します。その際、整数型の場合はsetInt()、文字列型の値が入る場合はsetString()して下さい。
    引数には、?の位置を指定します。SQL文の左側の?から1番目の?なら、第一引数に1、第二引数には挿入したい値を渡してあげてください。

  4. PreparedStatementクラスのオブジェクト.executeQuery()または.executeUpdate()で実行できます。
    返却されるResultSetの有無で使用するメソッドが変わります。

Connection con = DriverManager(hoge,hoge,hoge);

String sql = "select name from hogeData where id = ?";
Statement st = con.preparedStatement(sql);
st.setInt(1, 1);
ResultSet rs = st.executeQuery();


使用したほうが良い理由について深掘りしたい方は下記を読んで下さい。

(後日追記します)