使用JdbcTemplate时转义单引号

时间:2012-08-14 16:10:35

标签: java oracle spring escaping jdbctemplate

我们正在使用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 个答案:

答案 0 :(得分: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 injection的攻击。<​​/ p>

答案 1 :(得分:1)

尝试名称:

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