分页查询的优点
分页查询,是指当所查询数据量较多且需要显示时,采用按页显示的方法,分多次显示数据信息,而不是一次性全部显示
优点如下:
- 对服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小
- 对客户端:一次性显示所有信息,需要更多流量,加载时间也会更长,分页显示没有这个问题
- 对用户体验:一般最有价值的信息都会在前几页显示,也方便用户阅读,后部分查询出来的数据被使用几率很低
pagehelper的具体实现
1 实现原理:
PageHelper框架可以实现我们提供页码和每页条数,自动实现分页效果,收集分页信息,其分页原理就是在程序运行时,拦截sql语句,在语句尾部添加limit关键字,并按照分页信息向limit后追加分页数据
2 实现过程:
依赖导入
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
持久层
// 使用分页查询时,和普通查询没有区别,不需要手动添加limit
@Select("select id,name,address,gender from student_os")
List<Student> findAllStudents();
业务逻辑层
注意:PageHelper框架实现分页功能的配置代码要编写在执行查询的代码之前
PageInfo<>(list)中包含的不仅是查询到的list信息,还有页面属性信息
// page是页码,pageSize是每页条数
public PageInfo<Order> getAllStudentsByPage(Integer page,Integer pageSize){
// 使用指定的代码设置要查询的页码和每页的条数
// 在后面执行查询时,会自动按照这里指定的数据执行分页查询
// page是页码,1就是查询第一页,pageSize是每页条数
PageHelper.startPage(page,pageSize);
// 下面执行查询操作,这个操作会被PageHelper框架在运行的sql语句末尾添加limit语句
List<Student> list= studentMapper.findAllStudents();
// list中的数据就是按照分页条件查询出来的某一页的数据
// 但是分页查询方法返回的并不是list类型的对象,我们也需要获得分页的信息
// 然后将查询出的数据和分页信息结合返回,这个类型,就是PageInfo
return new PageInfo<>(list);
}
控制层
@GetMapping("/page")
@ApiOperation("分页查询所有订单")
@ApiImplicitParams({
@ApiImplicitParam(value = "页码",name="page",example = "1"),
@ApiImplicitParam(value = "每页条数",name="pageSize",example = "8")
})
public JsonResult<PageInfo<Student>> pageOrders(
Integer page,Integer pageSize){
PageInfo<Student> pageInfo=orderService.getAllStudentsByPage(page,pageSize);
return JsonResult.ok(page+" 页查询结果",pageInfo);
}
pagehelper实现优化
原因:
上面提到,pageinfo中不仅包含所要查询的数据信息,还包含许多页面相关的信息,具体如下
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的行数量
private int size;
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总页数
private int pages;
//前一页页号
private int prePage;
//下一页页号
private int nextPage;
//是否为第一页
private boolean isFirstPage;
//是否为最后一页
private boolean isLastPage;
//是否有前一页
private boolean hasPreviousPage;
//是否有下一页
private boolean hasNextPage;
//导航条中页码个数
private int navigatePages;
//所有导航条中显示的页号
private int[] navigatepageNums;
//导航条上的第一页页号
private int navigateFirstPage;
//导航条上的最后一页号
private int navigateLastPage;
一:许多字段信息并不会被使用,并且在数据的转储过程中占用额外的空间。
二:在微服务的开发中,服务的生产方导入分页依赖,返回分页的结果,而服务的消费方也必须导入分页依赖才能接收该结果,这不符合微服务模块的依赖配置理念
在微服务中的优化方案:
1 在公共模块中,新建工具类jsonPage