1

如果我在引号中有一堆东西,我会发现自己在做类似的事情:

String sql = "SELECT col1, col2, col3 "
           + "FROM my_awesome_table "
           + "WHERE strValue IN (%s)";

sql = String.format(sql, COMMA_JOINER.join(Iterables.transform(strValues,
                                                               new Function<String, String>() {
                                                                   @Override
                                                                   public String apply(String input) {
                                                                       return "'" + input.replaceAll("'", "''") + "'";
                                                                   }
                                                               })));

List<ResultObject> resultObjects =
        getSimpleJdbcTemplate().query(sql, resultObjectRowMapper());

但是我必须构建自己的 IN 子句,用单引号括住字符串,然后自己转义它们,这似乎很奇怪。必须有更好的方法!一些额外的上下文:我不希望查询太多(最多几十或几百行),只要我们不一次查询一行,优化就不是太大的问题!

4

2 回答 2

4

首先,即使没有 JdbcTemplate,您也应该使用准备好的语句,从而让 JDBC 驱动程序为您转义引号。SQL 查询类似于

select ... where strValue in (?, ?, ?, ?)

并且您将使用 绑定每个参数PreparedStatement.setParameter(),而无需转义任何内容。

使用NamedParameterJdbcTemplate更容易,因为 Spring 允许对整个字符串集合使用单个参数。Spring 文档中解释了它的用法:

String sql = "select ... from ... where strValue in :listOfValues";
Map namedParameters = Collections.singletonMap("listOfValues", strValues);
...
于 2012-06-20T21:35:16.140 回答
2

根据springsource上的这个线程,以下应该有效:

String sql = "SELECT col1, col2, col3 "
       + "FROM my_awesome_table "
       + "WHERE strValue IN (:items)";

getSimpleJdbcTemplate().query(
    sql
,   Collections.singletonMap("items", strValues)
,   resultObjectRowMapper()
);
于 2012-06-20T21:32:58.520 回答