5

JdbcTemplateを使用して、基盤となるOracleデータベースを変更しています。この方法でこれを行っていますupdate(String sql)

コードはどういうわけか次のようになります。

String name = "My name's yellow";
String sql = "update FIELD set NAME = '" + name "' where ID = 10
jdbcTemplate.update(sql);

これにより、エラーが発生します。

java.sql.SQLException: ORA-00933: SQL command not properly ended

問題は、変数でエスケープ'されていないことです。name

このキャラクターを脱出するための最も便利で正しい方法は何ですか?

4

2 に答える 2

5

PreparedStatementを使用します。このようにプレースホルダーを指定すると、JDBCドライバーは、データベースにステートメントとパラメーターを引数として送信することにより、これを正しく実行します。

    String updateStatement =
    "update " + dbName + ".COFFEES " +
    "set TOTAL = TOTAL + ? " +
    "where COF_NAME = ?";

    PreparedStatement updateTotal = con.prepareStatement(updateStatement);
    updateTotal.setInt(1, e.getValue().intValue());
    updateTotal.setString(2, e.getKey());

上記の疑問符はプレースホルダーを表しています。

これらの値はパラメーターとして渡されるため、引用符で問題が発生することはなく、 SQLインジェクションからも保護されます。

于 2012-08-14T16:12:05.450 に答える
0

名前を試してみてください:

if ( name.contains("'") ){
    name.replaceAll("'", "''");
}
于 2015-05-12T12:27:26.290 に答える