使用JdbcTemplate时如何转义单引号

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 中出现了未转义的字符 '
最方便且正确的转义该字符的方法是什么?
2个回答

6
使用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注入攻击。

3
我可以使用JdbcTemplate的update(String sql, Object[] args)方法,它可以自动完成此操作。 - user321068

0

尝试使用名称:

if ( name.contains("'") ){
    name.replaceAll("'", "''");
}

这是一个可行但不是最佳的解决方案。最好的方法是将SQL语句参数化,以处理所有情况,如其他答案所述。 - Levent Divilioglu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接