PageHelper
说起 PageHelper, 使用过 Mybatis 的朋友可能不是很陌生, 作为一款国人开发的分页插件, 它基本上满足了我们的日常需求. 但是, 我想去官方文档看看这个东西配合 Spring Boot 进行使用的时候, 发现了这个:
所以花了一个晚上的时间, 研究了一下合理的怎么玩这个.
快速入门
如果你想在一个 Spring Boot 项目中快速进行一次分页操作, 只需要两步即可:
导入 Maven
这里我导入的是官方最新的:
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>2.0.0</version>
- </dependency>
- <dependency>
- <groupId>tk.mybatis</groupId>
- <artifactId>mapper-spring-boot-starter</artifactId>
- <version>2.1.5</version>
- </dependency>
- <dependency>
- <groupId>com.GitHub.pagehelper</groupId>
- <artifactId>pagehelper-spring-boot-starter</artifactId>
- <version>1.2.10</version>
- </dependency>
使用
- // 只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询 (Select) 方法会被分页!!!!
- PageHelper.startPage(1, 10);
- return PageInfo.of(userService.findAll());
没错, 只需要两句代码即可达到我们想要的分页效果
进阶玩法
如果, 你仅仅是想简单的使用分页功能, 那么这篇文章到这里对你而言来说就已经结束了, 但是作为一个程序员, 你会仅仅满足于初级的玩儿法吗? 不! 你不会! 所以, 接着往下看~
从文档中, 我们可以看出, 作者给我们提供了很多的参数供我们配置:
helperDialect,offsetAsPageNum,rowBoundsWithCount,pageSizeZero,reasonable,params,supportMethodsArguments,autoRuntimeDialect,closeConn 等等, 我们可以通过配置这些属性来获得更为强大的效果~
这里需要说明一点, 网上的教程大部分是让我们在 xml 或者代码中配置, 其实如果你使用的是 springboot, 干嘛要舍近求远呢, 我们可以直接在 Spring boot 的配置文件 application.YAML 中进行配置:
- pagehelper:
- # dialect: 1
- # 分页插件会自动检测当前的数据库链接, 自动选择合适的分页方式(可以不设置)
- helper-dialect: MySQL
- # 上面数据库设置后, 下面的设置为 true 不会改变上面的结果(默认为 true)
- auto-dialect: true
- page-size-zero: false # 2
- reasonable: true # 3
- # 默认值为 false, 该参数对使用 RowBounds 作为分页参数时有效.(一般用不着)
- offset-as-page-num: false
- # 默认值为 false,RowBounds 是否进行 count 查询(一般用不着)
- row-bounds-with-count: false
- #params: 4
- #support-methods-arguments: 和 params 配合使用, 具体可以看下面的讲解
- # 默认值为 false. 设置为 true 时, 允许在运行时根据多数据源自动识别对应方言的分页
- auto-runtime-dialect: false # 5
- # 与 auto-runtime-dialect 配合使用
- close-conn: true
- # 用于控制默认不带 count 查询的方法中, 是否执行 count 查询, 这里设置为 true 后, total 会为 - 1
- default-count: false
- #dialect-alias: 6
1: 默认情况下会使用 PageHelper 方式进行分页, 如果想要实现自己的分页逻辑, 可以实现 Dialect(com.GitHub.pagehelper.Dialect) 接口, 然后配置该属性为实现类的全限定名称.(这里不推荐这样玩, 毕竟你用了别人的插件, 干嘛还要多此一举呢?)
2: 默认值为 false, 当该参数设置为 true 时, 如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询, 但是返回结果仍然是 Page 类型).
这里需要说一点, 虽然返回了全部的结果, 但是还是执行了 count 的动作, 开发者曾在 issue 中表示后面的版本会修复这个问题
经我的测试, 目前是还没有解决的
3: 合法性, 即纠错机制, 配置 reasonable 为 true, 这时如果 pageNum <= 0 会查询第一页, 如果 pageNum> pages 会查询最后一页.
4: 为了支持 startPage(Object params)方法, 增加了该参数来配置参数映射, 用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable, 不配置映射的用默认值, 默认值为
- pageNum=pageNum;
- pageSize=pageSize;
- count=countSql;
- reasonable=reasonable;
- pageSizeZero=pageSizeZero.
support-methods-arguments 支持通过 Mapper 接口参数来传递分页参数, 默认值 false, 分页插件会从查询方法的参数值中, 自动根据上面 params 配置的字段中取值, 查找到合适的值时就会自动分页.
来个小:
- @GetMapping("/page1")
- public PageInfo<UserDO> findPage(HttpServletRequest request) {
- // 直接将请求中含有的参数传给
- PageHelper.startPage(request);
- return PageInfo.of(userService.findAll());
- }
- /**
- * 查询所有信息
- * @return 人员列表
- */
- @Select("SELECT * FROM user")
- @Results({
- @Result(property = "userName", column = "user_name"),
- @Result(property = "password", column = "password")
- })
- List<UserDO> findAll();
- /*****************************************************************/
- // 这个方法和上面的区别是直接将含有条件的请求传给了 Mapper 接口
- @GetMapping("/page2")
- public PageInfo<UserDO> findPage2(HttpServletRequest request) {
- return PageInfo.of(userService.findPage(request));
- }
- //Mapper 接口遇上一个的区别就是多了一个参数, SQL 完全一致
- @Select("SELECT * FROM user")
- @Results({
- @Result(property = "userName", column = "user_name"),
- @Result(property = "password", column = "password")
- })
- List<UserDO> findPage(HttpServletRequest request);
5: 默认值为 false. 设置为 true 时, 允许在运行时根据多数据源自动识别对应方言的分页,
closeConn: 默认值为 true. 当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时, 会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接, 默认 true 关闭, 设置为 false 后, 不会关闭获取的连接, 这个参数的设置要根据自己选择的数据源来决定.
6:dialect-alias 参数, 允许配置自定义实现的 别名, 可以用于根据 JDBCURL 自动获取对应实现, 允许通过此种方式覆盖已有的实现, 配置示例如(多个配置用分号; 隔开):
pagehelper.dialect-alias=oracle=com.GitHub.pagehelper.dialect.helper.OracleDialect
几种不同的玩法
(小声 BB 一句)Lambda 是真的好看啊!
- //1. offsetPage
- PageHelper.offsetPage(1, 10);
- return PageInfo.of(userService.findAll());
- //2. Lambda
- return PageHelper.startPage(1, 10).doSelectPageInfo(() -> userService.findAll());
原创文章, 文笔有限, 才疏学浅, 文中若有不正之处, 万望告知.
源码地址:
- GitHub https://github.com/viyog/viboot
- Gitee https://gitee.com/viyog/viboot
记得顺手点个 star, 您的肯定是对我写作最大的动力!
参考资料
官方文档 https://pagehelper.github.io/docs/howtouse/
活动预告
来源: https://www.cnblogs.com/viyoung/p/10534910.html