サーチ…


備考

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値を設定する:

例えば、 setIntsetLongメソッドを使うと、オブジェクト( IntegerLong )の代わりにプリミティブ型( intlong )を使用し、 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がARRAYBLOBCLOBDATALINKJAVA_OBJECTNCHARNCLOBNVARCHARLONGNVARCHARREFROWIDSQLXMLまたは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を使用すると、その文がクローズされ、その文で使用されているすべてのリソースが解放されます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow