1. 程式人生 > >CRUD功能增強(複雜查詢)

CRUD功能增強(複雜查詢)

複雜條件查詢(根據使用者輸入拼接動態sql)

* 思路:
    * 複雜條件查詢基於分頁查詢,在分頁查詢的基礎上,拼接了動態sql
    * 首先在使用者訪問servlet的時候,將查詢部分的表單也進行提交
    * 在servlet中或取對應的引數map集合,在呼叫service方法的時候也將map集合作為引數
    * 同時在service呼叫dao的方法的時候也傳遞map
    * 在dao類中,遍歷map集合,獲取引數中鍵名對應的值並遍歷
    * 動態拼接sql語句
        * 初始化的sql語句為:"select * from user where 1 = 1 "(固定的寫法,方便遍歷拼接)
        * //獲取map遍歷來拼接字串
        * //新建一個stringBuilder來拼接字串
            StringBuilder sb = new StringBuilder(sql);
            Set<String> set = map.keySet();
           //用來在最後傳遞引數(list.toArray())
            List<Object> list = new ArrayList<>();
            for (String key : set) {
                //健壯性判斷,跳過當前頁與currentPage以及當前行數rows
                if ("currentPage".equals(key)||"rows".equals(key)){
                    continue;
                }
                //獲取值
                String value = map.get(key)[0];
                if (value!= null && !"".equals(value)){
                    //拼接字串
                    sb.append(" and "+key+" like ? ");
                    //拼接引數
                    list.add("%"+value+"%");
                }

            }
        //將Stringbuilder變為字串在進行查詢
        sql = sb.toString();
           return template.queryForObject(sql, Integer.class,list.toArray());
    *    還有一種比較方便的方法,也是動態拼接,但是不用遍歷map以及使用stringbuilder進行append
        String sql = "select * from user where 1=1";
           if(name!=null){
               and name like ?
             }
            if(address!=null){
              and address=?
             }
            if(email!=null){
               and email=?
             }

        * 這種方法的優點:可以同時使用模糊查詢以及比較準確的查詢(like,=)