CRUD功能增強(複雜查詢)
阿新 • • 發佈:2018-12-11
複雜條件查詢(根據使用者輸入拼接動態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,=)