首先是数据访问层,由于要实现模糊查询,所以需要借助stringBuilder来拼接sql语句,然后map遍历,用list集合以储存查询条件,然后利用where 1=1 加上 and key like %value%完成sql语句拼接并执行。
String sql = "select * from smbms_user where 1 = 1";
StringBuilder sb = new StringBuilder(sql);
Set<String> set = map.keySet();
List<Object> list = new ArrayList<>();
for (String key : set) {
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 + "%");
}
}
sb.append(" limit ? , ?");
if(start<0)
{
start = 0;
rows = 0;
}
list.add(start);
list.add(rows);
sql = sb.toString();
return template.query(sql, new BeanPropertyRowMapper<User>(User.class), list.toArray());
然后在业务逻辑层利用获取的数据和sql的查询获得总记录数,总页数,单页数据储存在pageBean对象中。
int currnetPage = Integer.parseInt(_currnetPage);
int rows = Integer.parseInt(_rows);
PageBean<User> pageBean = new PageBean<>();
pageBean.setCurrentPage(currnetPage);
pageBean.setRows(rows);
int totalCount = dao.getTotalCount(map);
pageBean.setTotalCount(totalCount);
int totalPage = totalCount % rows == 0 ? totalCount / rows : (totalCount / rows) + 1;
pageBean.setTotalPage(totalPage);
int start = rows * (currnetPage - 1);
if(currnetPage > totalPage) {
currnetPage = totalPage;
start = rows * (totalPage - 1);
}
//获得单页数据
List<User> list = dao.findUser(start, rows, map);
pageBean.setList(list);
return pageBean;
最后在界面层获取前台传过来的页码和行数将数据传到业务逻辑层,获得PageBean,将其传到前台界面进行展示。在jsp中,将传过来的PageBean遍历输出,就可以实现带查询的分页了。