2011-02-26 74 views
0

我使用Spring框架的jdbcTemplate从db获取记录列表。现在我想通过给查询附加一个约束来为其添加过滤。 例如。说列表代表者和表演 - 姓名,电子邮件和位置使用spring框架的jdbcTemplate进行复杂过滤

原始查询是

String sql = "SELECT name, email, location FROM persons WHERE status = ?"; 

取决于过滤器,限制将被追加到它

if(filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%" + filters.get("person_name") + "%'"; 
} 

//similarly 
if(filters.containsKey("person_email")) { 
    .... 
} 

//similarly 
if(filters.containsKey("person_location")) { 
    .... 
} 

因此查询将通过将它传递给jdbcTemplate对象的查询方法来创建并执行它

this.jdbcTemplate.query(sql, new Object[] { 1 }, RowMapper<Person> rowmapper) 

我担心的是,通过使用上述方法,它容易被注入,因为应用过滤器的值直接写入查询而没有任何转义。

是否有可能动态创建第二个参数(参数数组),就像构建查询一样?

是否有使用jdbcTemplate的替代方法?

编辑: 我现在用的StringEscapeUtils.escapeSql从org.apache.commons.lang.StringEscapeUtils逃脱值。但仍然在寻找更好的方法或春季已经提供的方法。

谢谢

回答

3

我相信还有更好的办法。把你的代码

if (filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%" + filters.get("person_name") + "%'"; 
} 

,并更改为

if (filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%?%"; 
} 

然后,您可以通过在查询的方法filters.get( “PERSON_NAME”)。这将使你免受注射攻击的伤害。

在回应置评

我想到了这一点。但是如何 动态地创建对象数组(新的 对象[] {..})?

您可以使用java.util.List并调用toArray()方法。有点像这个

import java.util.List; 
import java.util.ArrayList; 

List<Object> args = new ArrayList<Object>(); 

if (filters.containsKey("person_name")) { 
    sql += " AND name LIKE '%?%"; 
    args.add(filters.get("person_name")); 
} 

然后,当你需要的参数作为数组

args.toArray(); 
+0

我想到了这一点。但是如何动态创建对象数组('new object [] {..}')? – naiquevin 2011-03-01 06:56:35

+0

查看我的更新回答 – 2011-03-01 07:26:28

+0

应该算出来:) ..谢谢一吨 – naiquevin 2011-03-06 08:08:44