jdbc
PreparedStatement
サーチ…
備考
PreparedStatementは、文が実行される前に宣言し、パラメータのプレースホルダを許可します。これにより、ステートメントはサーバー上で一度準備(および最適化)された後、別のパラメーター・セットで再使用されます。
パラメータプレースホルダの追加の利点は、SQLインジェクションに対する保護を提供することです。これは、パラメータ値を個別に送信するか、ドライバが必要に応じて値を正しくエスケープするために行われます。
PreparedStatementのパラメータの設定
クエリ文字列のプレースホルダは、 set*メソッドを使用してset*する必要があります。
String sql = "SELECT * FROM EMP WHERE JOB = ? AND SAL > ?";
//Create statement to make your operations
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "MANAGER"); // String value
statement.setInt(2, 2850); // int value
特殊なケース
NULL値を設定する:
例えば、 setIntとsetLongメソッドを使うと、オブジェクト( IntegerとLong )の代わりにプリミティブ型( intとlong )を使用し、 NullPointerExceptionがスローされるため、null値を設定することはできません。
void setFloat(int parameterIndex, float x)
void setInt(int parameterIndex, int x)
void setLong(int parameterIndex, long x)
これらのケースは、 setNullを使用して処理できます。
setNull(int parameterIndex, int sqlType)
型付き型であるため、2番目のパラメータを指定する必要があります。java.sql.Typesを参照してください。
//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);
LOBの設定
LOBは特殊なオブジェクトを使用する必要があります。
Clob longContent = connection.createClob();
Writer longContentWriter = longContent.setCharacterStream(1); // position: beginning
longContentWriter.write("This will be the content of the CLOB");
pstmt = connection.prepareStatement("INSERT INTO CLOB_TABLE(CLOB_VALUE) VALUES (?)");
pstmt.setClob(1, longContent);
set*メソッドの例外
SQLException-parameterIndexがSQL文のパラメータマーカーに対応しない場合データベースアクセスエラーが発生した場合、またはこのメソッドが閉じられたPreparedStatement呼び出された場合
SQLFeatureNotSupportedException- sqlTypeがARRAY、BLOB、CLOB、DATALINK、JAVA_OBJECT、NCHAR、NCLOB、NVARCHAR、LONGNVARCHAR、REF、ROWID、SQLXMLまたはSTRUCTデータ型で、JDBCドライバがこのデータ型をサポートしない場合
準備された声明の基本的な使い方
この例では、パラメータ付きの挿入文でプリペアド文を作成し、そのパラメータに値を設定してから文を実行する方法を示します。
Connection connection = ... // connection created earlier
try (PreparedStatement insert = connection.prepareStatement(
"insert into orders(id, customerid, totalvalue, comment) values (?, ?, ?, ?)")) {
//NOTE: Position indexes start at 1, not 0
insert.setInt(1, 1);
insert.setInt(2, 7934747);
insert.setBigDecimal(3, new BigDecimal("100.95"));
insert.setString(4, "quick delivery requested");
insert.executeUpdate();
}
挿入ステートメントの疑問符( ? )は、パラメーターのプレースホルダーです。これらは後で(1からsetXXXインデックスを使用して) setXXXメソッドを使用してこれらのパラメータに値を設定する定位置パラメータです。
try-with-resourcesを使用すると、その文がクローズされ、その文で使用されているすべてのリソースが解放されます。