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を使用すると、その文がクローズされ、その文で使用されているすべてのリソースが解放されます。