2011-02-26 72 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