プリペアドステートメントの使用
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 [CData].[Default].Customers WHERE City=? AND CompanyName=?"; 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
INSERT を実行するには、一般的な実行メソッド、または次の例に示すようにexecuteUpdate メソッドを使用できます。
String query = "INSERT INTO [CData].[Default].Customers (City, CompanyName) VALUES (?,?)"; PreparedStatement pstmt = conn.prepareStatement(query); pstmt.setString(1, "XXX"); pstmt.setString(2, "YYY"); int count = pstmt.executeUpdate();