PageHelper:MyBatis 分页插件里的老面孔
PageHelper:MyBatis 分页插件里的老面孔
PageHelper 在 GitHub 上已经拿到 12.3K Star 了。
这个插件只干一件事,让 MyBatis 的分页查询写起来不那么啰嗦。单表、多表、各种数据库方言,它都帮你处理掉,自己不用再拼 limit 子句、不用算 offset。

1、 这玩意儿是干嘛的
MyBatis 自带分页支持基本停留在 SQL 层面,你想分页得自己写 limit,自己算偏移量,多表联查的时候还得注意子查询的顺序。PageHelper 把这些都封进拦截器里,传入页码和每页大小,剩下的它来。
它走的是物理分页,不是内存分页。区别在于,物理分页是在 SQL 里加 limit,数据库只返回你需要的那一页数据;内存分页是全部查回来再裁剪,数据量一大就直接爆掉。
2、 支持哪些数据库
支持的数据库覆盖面相当宽。MySQL、MariaDB、SQLite、PostgreSQL、Oracle、DB2、SQL Server、Informix、HSQLDB、H2 这些主流的都有,国产数据库也照顾到了,达梦、神通、人大金仓、瀚高、虚谷、行云、openGauss 都在列表里。

如果用的数据库不在默认列表里,可以通过 dialectAlias 参数配置自定义实现,也能用这种方式覆盖已有的方言实现,写法是用分号隔开多个键值对。
3、 怎么集成进来
Maven 项目在 pom.xml 里加一段依赖就行:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
Spring Boot 用户有专门的 starter 包,叫 pagehelper-spring-boot-starter,引入即用,不用手动配拦截器。最低支持到 MyBatis 3.1.0 版本,5 系列支持 JDK6+,6 系列要 JDK8+。
在代码里用起来是这样的,先调一次 PageHelper.startPage(pageNum, pageSize),紧跟着的那一次查询就会被自动加上分页,返回的是 Page 对象,里面既包含当前页的数据,也包含总数。
4、 拦截器规范
PageHelper 实现遵循一套叫 QueryInterceptor 的规范,简单说就是拦截器之间的执行顺序和参数传递有约定。这么做的背景是 MyBatis 的拦截器链可以叠加,几个插件一起用的时候没有规范会乱。作者把这个规范单独拎出来写在 wiki 里,自己写其他拦截器的时候可以照着来。
5、 适合谁用
写 MyBatis 的 Java 后端开发基本都能用上,尤其是后台管理系统这种分页查询密集的场景。新项目直接接,老项目改造成本也不高。如果项目里已经手写了 limit 拼接的代码,迁移的时候需要注意一下旧逻辑和 PageHelper 的衔接,别出现双重分页。
项目作者刘增辉在 MyBatis 圈子里挺活跃,除了 PageHelper 还写了一本《MyBatis 从入门到精通》,文档和 wiki 维护得很全,提交 BUG 走 GitHub issues,作者本人会回。文档地址和作者博客都能在 README 里找到。
对于已经在用 MyBatis 又被分页搞得有点烦的团队,这个插件是个稳妥的选择。开源时间长、维护活跃、Star 数说明用户基数够大,遇到问题翻 wiki 基本能翻到答案。
的选择。开源时间长、维护活跃、Star 数说明用户基数够大,遇到问题翻 wiki 基本能翻到答案。
更多推荐




所有评论(0)