高级查询+分页查询结合
一、高级查询+分页查询:
0、把pageSize和currentPage
封装到QueryObject对象
(高级查询对象的基类,包含所有查询对象的共性)中
因为任何查询对象都需要接收用户传入的这两个数据
class QueryObject {
@Getter@Setter
Integer currentPage = 1;
@Getter@Setter
Integer pageSize = 5;
}
1、在ITeacherDAO接口中定义高级分页查询
方法query2:
interface ITeacherDAO{
PageResult query2(TeacherQueryObject tqo);//高级查询+分页查询
}
2、在TeacherDAOImpl中具体实现:
//返回值是PageResult封装了界面看到的所有数据【高级+分页查询出来的数据】
@Override
public PageResult query2(TeacherQueryObject tqo) {
//===========高级查询+分页查询:两条分页查询的sql语句(LIMIT、COUNT)=====
//1、COUNT:高级(加上where的条件限制)+分页(分页查询所有)
String countSql = "SELECT COUNT(id) FROM t_teacher " + tqo.getQuery();
//查询结果总条数
Integer totalCount = JdbcTemplate.query(countSql, new IResultHandler<Long>() {
@Override
public Long handle(ResultSet rs) throws Exception {
if(rs.next()) {
return rs.getLong(1);
}
return 0L;
}
//细节:转成toArray()
}, tqo.getParameters().toArray()).intValue();
if(totalCount == 0) {//说明没有符合条件的数据,没有必要查询结果集
return PageResult.empty(tqo.getPageSize());
}
//2、LIMIT:高级(加上where的条件限制)+分页(分页查询LIMIT)
String resultSetSql = "SELECT * FROM t_teacher " + tqo.getQuery() + " LIMIT ?, ?";
//细节参数params【直接tqo.getParameters() 是只有高级查询的参数值,而分页也是需要有参数值的】
//增加LIMIT的两个占位符参数
tqo.getParameters().add((tqo.getCurrentPage() - 1) * tqo.getPageSize());//LIMIT第一个
tqo.getParameters().add(tqo.getPageSize());//LIMIT第二个
//查询结果集
List<Teacher> list = JdbcTemplate.query(resultSetSql, new BeanListHandler<>(Teacher.class), tqo.getParameters().toArray());
//分页结果对象
return new PageResult<Teacher>(list, totalCount, tqo.getCurrentPage(), tqo.getPageSize()) ;
}
3、进行代码测试:
4、servlet、jsp进行简单修改
二、解决翻页丢失高级查询数据
1、原因:分页是通过超链接
实现的,每次点击都是在发送一次新的请求
,(该请求和高级查询表单没有关系)不会携带上一次请求的数据,导致高级查询后的数据丢失。
2、解决:使用js 定义方法
来解决—在翻页时,同时提交高级表单参数和当前第几页
(currentPage)
<%-- 调用go2函数,并传递跳转的页码 --%>
<a href="javascript:go2(1)">首页</a>
<%-- 细节:超链接的href属性值上调用js的方法(要加javascript,不然会被当参数) --%>
<a href="javascript:go2(${pageResult.prevPage})">上页</a>
<a href="javascript:go2(${pageResult.nextPage})">下页</a>
<a href="javascript:go2(${pageResult.totalPage})">末页</a>
<script type="text/javascript">
function go2(pageNo){
//实现点击超链接之后,调用本方法go2(pageNo),控制跳转到
//[但是需要将pageNode赋值给 第几页(提交表单时才会将当前的currentPage=pageNode 提交给后台)]
//解决:将需要调转的页面pageNo 设置到<input type="number" id = "currentPage" name="currentPage" /> 控件的value值上
document.getElementById("currentPage").value = pageNo;
//alert(pageNo);
document.forms[0].submit();
}
</script>
三、将请求封装成一个对象,可以借助Apache 的工具:commons-beanutils 实现对象拷贝