2012-06-20 11 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

相關問題