当前位置:   article > 正文

数据库分页查询详解_条件查询+分页查询

条件查询+分页查询

分页查询的优点

所谓分页查询,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示

分页的优点:

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

2.客户端:一次性显示所有信息所需流量过大,加载时间也会加长,而分页显示不存在此问题

3.用户体验上: 一般最有价值的数据也会在前几页显示,方便用户记忆,多查询出来的数据使用几率较低

同样实现分页查询需要我们在开发时多几个步骤:


PageHelper实现分页查询原理

可以通过在数据库中添加limit关键字的方法实现分页查询

但是在查询过程中,需要我们计算相关的分页信息和参数

limit 0,10 limit 10,10

所以我们采用框架来让我们更高效的完成分页功能

PageHelper框架的分页原理就是在程序运行时,在sql语句尾部添加limit关键字,并按照分页信息向limit后追加分页数据

首先:添加依赖

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper-spring-boot-starter</artifactId>
  4. </dependency>

 PageHelper的使用

编写持久层 

  1. // 分页查询所有订单的方法
  2. // 使用PageHepler框架完成分页查询原理是在sql语句运行时,会在sql语句后添加limit关键字
  3. // 所以方法在持久层中编写时,没有任何分页的特征,也无需关注分页业务(注解和xml都是一样的)
  4. @Select("select id,user_id,commodity_code,count,money from order_tbl")
  5. List<Order> findAllOrders();

这个方法并不需要任何分页的参数或返回值,sql也不需要编写limit

都是在业务逻辑层中由PageHelper框架处理的

编写业务逻辑层

先编写一个方法使用PageHelper的功能

先不用写接口,直接在业务逻辑层中写方法

  1. // 分页查询所有订单信息的方法
  2. // page是页码,pageSize是每页条数
  3. public PageInfo<Order> getAllOrdersByPage(Integer page,Integer pageSize){
  4. // PageHelper框架使用分页功能的核心代码,是要在执行查询数据库的代码运行之前
  5. // 编写PageHelper.startPage(page,pageSize)方法,设置分页查询的条件
  6. // 这里的page如果是1,就表示查询第1
  7. PageHelper.startPage(page,pageSize);
  8. // 上面分页条件设置好之后,下面执行查询操作,这个操作的末尾就会被添加limit
  9. List<Order> list= orderMapper.findAllOrders();
  10. // 查询结果list只包含分页数据,并不能包含分页信息(总页数,总条数等)
  11. // 所以要利用PageHelper框架提供的PageInfo类型来返回信息
  12. // PageInfo和SpringData的Page接口是类似的,也是既能包含数据,又能包含分页信息
  13. // 使用方式是直接实例化,它的构造方法中会自动按上面分页查询计算需要的分页信息
  14. return new PageInfo<>(list);
  15. }

 编写控制层

  1. @Autowired
  2. // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
  3. private OrderServiceImpl orderService;
  4. //...
  5. @GetMapping("/page")
  6. @ApiOperation("分页查询所有订单")
  7. @ApiImplicitParams({
  8. @ApiImplicitParam(value = "页码",name="page",example ="1" ),
  9. @ApiImplicitParam(value = "每页条数",name="pageSize",example ="10" )
  10. })
  11. public JsonResult<PageInfo<Order>> pageOrder(Integer page,Integer pageSize){
  12. PageInfo<Order> pageInfo=
  13. orderService.getAllOrdersByPage(page,pageSize);
  14. return JsonResult.ok("查询完成",pageInfo);
  15. }

附:PageInfo全部分页信息属性 

  1. //当前页
  2. private int pageNum;
  3. //每页的数量
  4. private int pageSize;
  5. //当前页的行数量
  6. private int size;
  7. //当前页面第一个元素在数据库中的行号
  8. private int startRow;
  9. //当前页面最后一个元素在数据库中的行号
  10. private int endRow;
  11. //总页数
  12. private int pages;
  13. //前一页页号
  14. private int prePage;
  15. //下一页页号
  16. private int nextPage;
  17. //是否为第一页
  18. private boolean isFirstPage;
  19. //是否为最后一页
  20. private boolean isLastPage;
  21. //是否有前一页
  22. private boolean hasPreviousPage;
  23. //是否有下一页
  24. private boolean hasNextPage;
  25. //导航条中页码个数
  26. private int navigatePages;
  27. //所有导航条中显示的页号
  28. private int[] navigatepageNums;
  29. //导航条上的第一页页号
  30. private int navigateFirstPage;
  31. //导航条上的最后一页号
  32. private int navigateLastPage;

使用JsonPage来返回结果

当前我们分页查询使用的类型是PageInfo

如果将此类型来做业务逻辑的返回值,当前方法作为dubbo生产者对外提供服务时

消费者调用该服务需要使用PageInfo类型对象来进行接收,这样消费者也需要加上PageHelper依赖,显然是不合理的

所以在设计通用模块时,可以添加一个专门用于返回分页结果的类,JsonPage,代替PageInfo

这样当我们在使用时,所有分页或类似的操作,就都可以使用此类

  1. <!--
  2. 将PageHelper框架分页查询结果对象PageInfo转换为JsonPage类型
  3. 我们需要再commons模块中添加PageHelper的依赖
  4. -->
  5. <dependency>
  6. <groupId>com.github.pagehelper</groupId>
  7. <artifactId>pagehelper</artifactId>
  8. <version>5.2.0</version>
  9. </dependency>

在restful包中新建一个JsonPage类

 

  1. @Data
  2. public class JsonPage<T> implements Serializable {
  3. // 当前类在实际开发中替代Page/PageInfo这样的由框架提供的分页信息类
  4. // 这样当前微服务项目所有分页业务都可以使用这个类型,实现通用
  5. // 属性的个数原则是满足前端需要即可,这里列出最基本的分页信息属性
  6. @ApiModelProperty(value = "总页数",name = "totalPages")
  7. private Integer totalPages;
  8. @ApiModelProperty(value = "总条数",name = "totalCount")
  9. private Long totalCount;
  10. @ApiModelProperty(value = "页码",name = "page")
  11. private Integer page;
  12. @ApiModelProperty(value = "每页条数",name = "pageSize")
  13. private Integer pageSize;
  14. // JsonPage对象要能够报错分页数据
  15. @ApiModelProperty(value = "分页数据",name = "list")
  16. private List<T> list;
  17. // 下面编写一个方法,能够实现将PageInfo类型对象转换为JsonPage对象返回
  18. public static <T> JsonPage<T> restPage(PageInfo<T> pageInfo){
  19. // 将参数pageInfo对象相同意义的属性赋值到JsonPage对象中,来完成转换
  20. JsonPage<T> jsonPage=new JsonPage<>();
  21. jsonPage.setTotalPages(pageInfo.getPages());
  22. jsonPage.setTotalCount(pageInfo.getTotal());
  23. jsonPage.setPage(pageInfo.getPageNum());
  24. jsonPage.setPageSize(pageInfo.getPageSize());
  25. // 分页数据也要赋值过来
  26. jsonPage.setList(pageInfo.getList());
  27. // 最后返回转换完成的对象
  28. return jsonPage;
  29. }
  30. }

在service业务逻辑层接口添加此方法

  1. // 返回JsonPage类型的分页查询订单的方法
  2. JsonPage<Order> getAllOrdersByPage(Integer page,Integer pageSize);

 剩下就是实现类和控制器类进行修改    

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49083?site
推荐阅读
相关标签
  

闽ICP备14008679号