pagehelper实现分页查询

分页查询的优点

分页查询,是指当所查询数据量较多且需要显示时,采用按页显示的方法,分多次显示数据信息,而不是一次性全部显示

优点如下:

  1. 对服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小

  1. 对客户端:一次性显示所有信息,需要更多流量,加载时间也会更长,分页显示没有这个问题

  1. 对用户体验:一般最有价值的信息都会在前几页显示,也方便用户阅读,后部分查询出来的数据被使用几率很低

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值