java動態拼接sql語句而且執行時給sql語句的參數賦值

問題

在這裏舉一個例子,好比我要作一個多條件模糊查詢,用戶輸入的時候有可能輸入一個條件,也有可能輸入兩個條件,這時執行查詢的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

很是重要的注意事項

  1. 拼接sql的時候必定要注意空格,儘可能多留幾個空格,不然sql拼接後報錯了
  2. 拼接好的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

相關文章
相關標籤/搜索