プリペアドステートメントの使用
PreparedStatement オブジェクトは、プリコンパイルされたSQL ステートメントを表します。PreparedStatement は複数回使用でき、SQL インジェクション攻撃を軽減します。PreparedStatement には、SELECT、INSERT、UPDATE、またはDELETE ステートメントを使用できます。
プリペアドステートメントを実行するには、Statement クラスの一般的な実行メソッドを使用できます。このセクションでは、プリペアドステートメントの実行方法について説明します。
-
Connection クラスのprepareStatement メソッドを使用して、PreparedStatement オブジェクトをインスタンス化します。
接続を作成するにはCode からの接続 を参照してください。
- PreparedStatement の対応するセッターメソッドを呼び出すことによってパラメータを宣言します。パラメータインデックスは1から始まることに注意してください。
- PreparedStatement の実行メソッドを呼び出して、ステートメントを実行します。
- PreparedStatement のgetResultSet メソッドを呼び出して、ResultSet オブジェクトに結果をプルします。
- ResultSet.next を呼び出して、結果セットを反復処理します。ResultSetMetaData クラスを使用して、結果セットに関するカラム情報を取得します。ResultSetMetaData オブジェクトをインスタンス化するには、ResultSet のgetMetaData メソッドを呼び出します。
Select
次の例は、SELECT プリペアドステートメントを実行する方法を示しています。
String query = "SELECT * FROM Lead WHERE Id=? AND FirstName=?"; PreparedStatement pstmt = conn.prepareStatement(query); pstmt.setString(1, "XXX"); pstmt.setString(2, "YYY"); boolean ret = pstmt.execute(); if (ret) { ResultSet rs=pstmt.getResultSet(); while(rs.next()) { for(int i=1;i<=rs.getMetaData().getColumnCount();i++) { System.out.println(rs.getMetaData().getColumnLabel(i) +"="+rs.getString(i)); } } }
Insert
挿入を実行するには、一般的な実行メソッド、または次の例に示すようにexecuteUpdate メソッドを使用できます。
新しいレコード用に生成されたキーを取得するには、prepareStatement 呼び出しでStatement.RETURN_GENERATED_KEYS を指定します。ステートメントの実行後にgetGeneratedKeys メソッドを呼び出します。
String query = "INSERT INTO Lead (Id, FirstName) VALUES (?,?)"; PreparedStatement pstmt = conn.prepareStatement(query,Statement.RETURN_GENERATED_KEYS ); pstmt.setString(1, "XXX"); pstmt.setString(2, "YYY"); int count = pstmt.executeUpdate(); ResultSet rs = pstmt.getGeneratedKeys(); while(rs.next()) { for(int i=1;i<=rs.getMetaData().getColumnCount();i++) { System.out.println(rs.getMetaData().getColumnLabel(i) +"="+rs.getString(i)); } }
Upsert
アップサートの実行は、挿入と同じです。一般的な実行メソッドかexecuteUpdate を使用します。新しいレコード用に生成されたキーを取得するには、prepareStatement 呼び出しでStatement.RETURN_GENERATED_KEYS を指定します。ステートメントの実行後にgetGeneratedKeys メソッドを呼び出します。
String query = "UPSERT INTO Lead (Id, FirstName) VALUES (?,?)"; PreparedStatement pstmt = conn.prepareStatement(query,Statement.RETURN_GENERATED_KEYS ); pstmt.setString(1, "XXX"); pstmt.setString(2, "YYY"); int count = pstmt.executeUpdate(); ResultSet rs = pstmt.getGeneratedKeys(); while(rs.next()) { for(int i=1;i<=rs.getMetaData().getColumnCount();i++) { System.out.println(rs.getMetaData().getColumnLabel(i) +"="+rs.getString(i)); } }
Update
更新を実行するには、一般的な実行メソッド、または次の例に示すようにexecuteUpdate メソッドを使用できます。executeUpdate メソッドは影響を受けた行を返します。もしくは、getUpdateCount を呼び出します。
String query = "UPDATE Lead SET FirstName = ? WHERE Id=?"; PreparedStatement pstmt = conn.prepareStatement(query); pstmt.setString(1, "XXX"); pstmt.setString(2, "YYY"); int count = pstmt.executeUpdate(); System.out.println("Affected rows: "+count);
Delete
削除を実行するには、一般的な実行メソッド、または次の例に示すようにexecuteUpdate メソッドを使用できます。executeUpdate メソッドは影響を受けた行を返します。もしくは、getUpdateCount を呼び出します。
String query = "DELETE FROM Lead WHERE Id = ?";
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1, "XXX");
int count = pstmt.executeUpdate();
System.out.println("Affected rows: "+count);