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,=)
        *例子:
	//直接将参数(name,address,email)传进去,同时省略了遍历的过程
	public List<User> findUserByPage(int cp, int rs, String name,String address, String email) {
		        String sql = "select * from user where 1 = 1 ";
		        //获取map遍历来拼接字符串
		        if (name != null){
		            sql+= " and name like '%"+name+"%'";
		        }
		        if (address != null){
		            sql+= " and address like '%"+address+"%'";
		        }
		        if (email != null){
		            sql+= " and email like '%"+email+"%'";
		        }
		
		        sql+= " limit ?,?";
		
		        return  template.query(sql, new BeanPropertyRowMapper<>(User.class),cp,rs);
		    }

猜你喜欢

转载自blog.csdn.net/qq_35472880/article/details/82813292