程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(2)

基于SpringBoot2开发WebApi(五)MySQL分页查询

发布于2021-06-08 12:16     阅读(104)     评论(0)     点赞(10)     收藏(3)


1.分页查询的意义

随着系统的业务进行,系统产生的数据存储会越来越多,如果根据用户的查询条件一股脑的将所有数据直接返回给前端展示,不仅仅导致查询效率低下,结果集返回的过程也会占用很大的带宽,影响到用户的操作体验。

这个时候我们可以将用户查询条件内的数据采用分页的方式进行,比如,我们将200条数据按每页20条,分10页来返回;由于每次查询我们都是只返回20条,在数据传输过程中大大降低了带宽的要求。

即便查询条件内的结果集中数据有2万条或者更多,每次查询的时候都是只返回当前页的20条数据。对于用户来说,避免了数据量大带来的系统卡顿或者查询等待,大大提升用户体验。

可以把系统分页查询看做类似书籍装订的模式,一本书籍有很多内容,将这些内容分别印刷在不同的纸张上,按顺序进行打上页码,装订起来,用户可以根据页码找到自己想看到的内容。

2.依赖引入

在pom.xml中引入分页查的依赖

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

3.配置文件

在.yml中增加pagehelper配置

  1. pagehelper:
  2. helperDialect: mysql
  3. reasonable: true
  4. supportMethodsArguments: true
  5. params: count=countSql

参数说明:

(1)helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:    oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby 

 特别注意:使用 SqlServer2012 数据库时,需要手动指定为sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。你也可以实现AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

(2)offsetAsPageNum:默认值为false,该参数对使用RowBounds作为分页参数时有效。 当该参数设置为true时,会将RowBounds中的offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。

(3)rowBoundsWithCount:默认值为false,该参数对使用RowBounds作为分页参数时有效。 当该参数设置为true时,使用RowBounds分页会进行 count 查询。

(4)pageSizeZero:默认值为false,当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。

(5)reasonable:分页合理化参数,默认值为false。当该参数设置为true时,pageNum<=0时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false时,直接根据参数进行查询。

(6)params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为:pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。

(7)supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面params配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的com.github.pagehelper.test.basic包下的ArgumentsMapTest和ArgumentsObjTest。

(8)autoRuntimeDialect:默认值为false。设置为true时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver)。

(9)closeConn:默认值为true。当使用运行时动态数据源或没有设置helperDialect属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为false后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

4.分页查询使用方法的封装

  1. public class PageUtils {
  2. public static PageResult getPageResult(PageInfo<?> pageInfo) {
  3. PageResult pageResult = new PageResult();
  4. pageResult.setPageNum(pageInfo.getPageNum());
  5. pageResult.setPageSize(pageInfo.getPageSize());
  6. pageResult.setTotalSize(pageInfo.getTotal());
  7. pageResult.setTotalPages(pageInfo.getPages());
  8. pageResult.setContent(pageInfo.getList());
  9. return pageResult;
  10. }
  11. }

PageResult 结果集定义

  1. public class PageResult {
  2. /**
  3. * 当前页码
  4. */
  5. private int pageNum;
  6. /**
  7. * 每页数量
  8. */
  9. private int pageSize;
  10. /**
  11. * 页码总数
  12. */
  13. private int totalPages;
  14. /**
  15. * 记录总数
  16. */
  17. private long totalSize;
  18. /**
  19. * 数据模型
  20. */
  21. private List<?> content;
  22. public int getPageNum() {
  23. return pageNum;
  24. }
  25. public void setPageNum(int pageNum) {
  26. this.pageNum = pageNum;
  27. }
  28. public int getPageSize() {
  29. return pageSize;
  30. }
  31. public void setPageSize(int pageSize) {
  32. this.pageSize = pageSize;
  33. }
  34. public long getTotalSize() {
  35. return totalSize;
  36. }
  37. public void setTotalSize(long totalSize) {
  38. this.totalSize = totalSize;
  39. }
  40. public int getTotalPages() {
  41. return totalPages;
  42. }
  43. public void setTotalPages(int totalPages) {
  44. this.totalPages = totalPages;
  45. }
  46. public List<?> getContent() {
  47. return content;
  48. }
  49. public void setContent(List<?> content) {
  50. this.content = content;
  51. }
  52. }

5.在Service里面增加分页实现

在接口对应的Service的方法中,增加对分页查询的实现

  1. /**
  2. * 查询用户列表
  3. * @param key
  4. * @param pageNum 当前页码
  5. * @param pageSize 每页显示的条数
  6. * @return
  7. */
  8. public PageResult queryAdminUserList(String key,int pageNum, int pageSize,BigInteger roleId)
  9. {
  10. //设置当前查询的页
  11. PageHelper.startPage(pageNum,pageSize);
  12. List<AdminUser> adminUserList=adminUserDao.queryAdminUserList(key,roleId);
  13. //将结果集存储到分页查询统一结果集里面
  14. PageInfo<AdminUser> pageInfo=new PageInfo<>(adminUserList);
  15. PageResult pageResult= PageUtils.getPageResult(pageInfo);
  16. return pageResult;
  17. }

6.Controller增加分页查询参数的传入

  1. @CheckToken
  2. @ApiOperation(value = "用户列表查询", notes = "用户列表查询")
  3. @ApiImplicitParams({
  4. @ApiImplicitParam(name = "key",value = "查询条件"),
  5. @ApiImplicitParam(name = "pageNum",value = "当前页",required = true),
  6. @ApiImplicitParam(name = "pageSize",value = "每页显示条数",required = true),
  7. @ApiImplicitParam(name = "roleId",value = "角色id",required = true)
  8. })
  9. @ApiResponses({
  10. @ApiResponse(code = 200,message = "成功",response = AdminUser.class),
  11. })
  12. @PostMapping(value = "queryAdminUserList")
  13. public Result<Object> queryAdminUserList(String key, int pageNum, int pageSize,BigInteger roleId){
  14. try {
  15. PageResult pageUserList = adminUserService.queryAdminUserList(key,pageNum,pageSize,roleId);
  16. return ResultGenerator.success("成功",pageUserList);
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. return ResultGenerator.error("失败:" + e.getMessage());
  20. }
  21. }

 

原文链接:https://blog.csdn.net/qq_17486399/article/details/117549216



所属网站分类: 技术文章 > 博客

作者:哦哦好吧

链接:http://www.javaheidong.com/blog/article/219577/7e82e352be498642d817/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)