复杂条件查询(根据用户输入拼接动态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);
}