高级查询+分页查询结合

一、高级查询+分页查询:

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 实现对象拷贝