学习Spring Boot:(八)Mybatis使用分页插件PageHelper

Bertha 。 2023-10-02 15:37 7阅读 0赞

首先Mybqtis可以通过SQL 的方式实现分页很简单,只要在查询SQL 后面加上limit #{currIndex} , #{pageSize}就可以了。

本文主要介绍使用拦截器的方式实现分页。

实现原理

拦截器实现了拦截所有查询需要分页的方法,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句,从而达到SQL 分页的目的,它的好处不用多说了,代码也写的很少,对SQL 的侵入较少,推荐使用。

步骤

添加依赖
  1. <pagehelper.version>1.2.3</pagehelper.version>
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>${pagehelper.version}</version>
  6. </dependency>
配置文件

在系统配置文件中加入pagehelper的配置信息:

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

针对pagehelper的配置参数,查询了一下:
\1. helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
**特别注意:**使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

  1. offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。
    当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
  2. rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。
    当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
  3. pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
  4. reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,
    pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
  5. params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,
    可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
    默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
  6. supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
    使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest
  7. autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页
    (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五
  8. closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接,
    通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

重要提示:

offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。
注: PageRowBounds 想要查询总数也需要配置该属性为 true

使用

在业务查询 的时候加上

  1. PageHelper.startPage(pageIndex, pageSize);

例如:

  1. @Override
  2. public List<SysUserEntity> query(SysUserEntity user) {
  3. // 查询第一页的两条数据
  4. PageHelper.startPage(1, 2);
  5. return sysUserDao.query(user);
  6. }

测试一下返回结果:

image

我们来看下它执行的SQL :

  1. Preparing: SELECT count(0) FROM sys_user
  2. Parameters:
  3. Total: 1
  4. Preparing: SELECT * FROM sys_user LIMIT ?
  5. Parameters: 2(Integer)
  6. Total: 2

补充

使用方法

使用的时候,需要仔细阅读作者的文章
pagehelper/Mybatis-PageHelper

主要是阅读使用方法,以及各个场景中使用什么方法解决问题,注意事项。

分页排序
  1. PageHelper.startPage(pageIndex, pageSize, orderBy);
支持返回PageInfo
  1. @Override
  2. public PageInfo queryByPageInfo(SysUserEntity user) {
  3. return PageHelper.startPage(1,2).doSelectPageInfo(() -> sysUserDao.query(user));
  4. }

使用Swagger测试返回数据:

  1. {
  2. "pageNum": 1,
  3. "pageSize": 2,
  4. "size": 2,
  5. "startRow": 1,
  6. "endRow": 2,
  7. "total": 4,
  8. "pages": 2,
  9. "list": [
  10. {
  11. "id": 1,
  12. "username": "def",
  13. "password": "123",
  14. "mobile": null,
  15. "email": null,
  16. "createUserId": null,
  17. "createDate": null
  18. },
  19. {
  20. "id": 7,
  21. "username": "wuwii",
  22. "password": "123",
  23. "mobile": null,
  24. "email": null,
  25. "createUserId": null,
  26. "createDate": null
  27. }
  28. ],
  29. "prePage": 0,
  30. "nextPage": 2,
  31. "isFirstPage": true,
  32. "isLastPage": false,
  33. "hasPreviousPage": false,
  34. "hasNextPage": true,
  35. "navigatePages": 8,
  36. "navigatepageNums": [
  37. 1,
  38. 2
  39. ],
  40. "navigateFirstPage": 1,
  41. "navigateLastPage": 2,
  42. "firstPage": 1,
  43. "lastPage": 2
  44. }

发表评论

表情:
评论列表 (有 0 条评论,7人围观)

还没有评论,来说两句吧...

相关阅读