問題
在這裏舉一個例子,好比我要作一個多條件模糊查詢,用戶輸入的時候有可能輸入一個條件,也有可能輸入兩個條件,這時執行查詢的sql語句就不肯定了,但能夠用動態拼接sql語句來解決這個問題。 java
<br/>sql
解決方法
<br/> 1.就拿我上面的那個多條件模糊查詢爲例,第一步是拼接sql語句,先定義一個通用的sql語句,String sql = "select * from user where 1 = 1 ";這裏添加where 1= 1是一個小技巧,方便後面sql語句的拼接。數組
String sql = "select * from user where 1 = 1 "; StringBuilder sb = new StringBuilder(sql);//建立一個StringBuilder並先把定義的通用sql放進去
<br/>app
2.在這裏我用一個map集合將條件查詢的三個參數在servlet中獲取了,接下來遍歷map集合判斷對應的屬性是否有值,若是有值能夠拼接到剛纔定義的通用sql語句後面jsp
//遍歷map看是否有屬性,condition是一個把jsp頁面傳遞過來輸入數據封裝的map集合 Set<String> keySet = condition.keySet(); //定義參數集合 List<Object> params = new ArrayList<Object>(); for (String key : keySet) { //排除分頁條件參數 if ("currentPage".equals(key)||"rows".equals(key)){ continue;//結束當前循環 } String value = condition.get(key)[0]; //判斷value是否有值 if (value != null && !"".equals(value)){ //動態拼接sql sb.append(" and "+key+" like ? "); params.add("%"+value+"%");//加?的值 } }
<br/> 3.執行sql,執行時須要參數,這又是一個問題,我得解決方法時定義了一個list集合,用於存儲參數的值value,到最後執行寫進去,因爲是個list集合,能夠直接用list.toArray轉化爲參數數組寫進去ui
return template.query(sb.toString(),new BeanPropertyRowMapper<User>(User.class),params.toArray());
<br/><br/>spa
很是重要的注意事項
- 拼接sql的時候必定要注意空格,儘可能多留幾個空格,不然sql拼接後報錯了
- 拼接好的sql須要使用toString將StringBuilder轉化爲String類型,參數直接使用toArray()將list集合轉化爲參數數組
<br/>code
總體
public List<User> findByPage(Map<String, String[]> condition) { String sql = "select * from user where 1 = 1 "; StringBuilder sb = new StringBuilder(sql); //遍歷map看是否有屬性 Set<String> keySet = condition.keySet(); //定義參數集合 List<Object> params = new ArrayList<Object>(); for (String key : keySet) { //排除分頁條件參數 if ("currentPage".equals(key)||"rows".equals(key)){ continue;//結束當前循環 } String value = condition.get(key)[0]; //判斷value是否有值 if (value != null && !"".equals(value)){ //動態拼接sql sb.append(" and "+key+" like ? "); params.add("%"+value+"%");//加?的值 } } return template.query(sb.toString(),new BeanPropertyRowMapper<User>(User.class),params.toArray()); }
<br/><br/><br/>blog