高级查询+分页查询结合

高级查询+分页查询结合

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

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 实现对象拷贝
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
MySQL 提供了一些高阶的查询语句用法,可以帮助我们更灵活、高效地进行数据查询。以下是一些常用的高阶用法: 1. 子查询: 子查询是将一个查询嵌套在另一个查询中的查询结构。它可以用作 `SELECT` 语句中的列、`FROM` 子句中的表、`WHERE` 子句中的条件等。 示例: ```sql SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM another_table WHERE condition); ``` 2. 联合查询: 联合查询用于将两个或多个查询的结果合并成一个结果集。可以使用 `UNION` 或 `UNION ALL` 运算符来执行联合查询。 示例: ```sql SELECT column_name FROM table1 UNION SELECT column_name FROM table2; ``` 3. 分页查询分页查询用于在结果集中进行分页显示数据。可以使用 `LIMIT` 子句指定要返回的记录数量,并使用 `OFFSET` 子句指定要跳过的记录数量。 示例: ```sql SELECT column_name FROM table_name LIMIT number_of_rows OFFSET offset_value; ``` 4. 排序: 可以使用 `ORDER BY` 子句对查询结果进行排序。可以按照一个或多个列进行升序或降序排序。 示例: ```sql SELECT column_name FROM table_name ORDER BY column_name ASC; ``` 5. 聚合函数和分组: 使用聚合函数(如 `SUM`、`AVG`、`COUNT` 等)可以对数据进行聚合计算。可以结合 `GROUP BY` 子句将结果集按照一个或多个列进行分组。 示例: ```sql SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; ``` 这些是一些常用的 MySQL 查询语句高阶用法,可以根据具体需求进行学习和使用。此外,MySQL 还提供了其他高级特性,如窗口函数、子查询优化、索引优化等,可以进一步提升查询性能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟庭大师兄

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值