2012-06-20 12 views
1

如果我有引号了一堆东西,我发现自己做这样的事情:Java Spring:使用JdbcTemplates使用IN子句执行mysql查询的最佳方法是什么?

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子句,围绕着琴弦用单引号和逃避他们自己。必须有更好的方式!一些额外的上下文:我不希望被查询的数量太多(最多几十或几百行),只要我们不一次一个地查询这些行,优化就不是太多问题!

回答

2

this thread on springsource,下面应该工作:

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

getSimpleJdbcTemplate().query(
    sql 
, Collections.singletonMap("items", strValues) 
, resultObjectRowMapper() 
); 
+0

这很好用(虽然必须将行映射器切换为第二个arg)谢谢! – Zugwalt

+0

一个注意事项:从Spring 3.1开始,不推荐使用SimpleJdbTemplate。 JdbcTemplate和NamedParameterJdbcTemplate现在提供了SimpleJdbcTemplate的所有功能。对于IN子句,您必须使用NamedParameterJdbcTemplate。 – masted

4

首先,即使没有JdbcTemplate的,你应该使用预处理语句,从而让JDBC驱动程序逃脱报价为您服务。 SQL查询会是这样的

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

,你会使用PreparedStatement.setParameter()每个参数绑定,而无需任何逃生。

由于使用NamedParameterJdbcTemplate,它更容易,因为Spring允许使用单个参数来存储整个字符串集合。它的用法在Spring documentation中有解释:

String sql = "select ... from ... where strValue in :listOfValues"; 
Map namedParameters = Collections.singletonMap("listOfValues", strValues); 
... 
+1

是的!我知道我在做一些非常错误的事情,但是对于程序员来说,他的作品块等价于!谢谢! – Zugwalt

相关问题