mybatis 配置 pagehelper 实现物理分页,核心是插件在 sql 执行前自动重写语句并添加 limit 等原生分页语法;需引入 pagehelper-spring-boot-starter(spring boot)或 pagehelper(传统项目),版本 5.3.0+;必须显式配置 helper-dialect;分页调用仅对紧随其后的第一个查询生效;结果封装推荐使用 pageinfo 获取总条数、页码、导航数组等完整分页信息。

MyBatis 配置 PageHelper 实现物理分页,核心是让插件在 SQL 执行前自动重写语句,加上 LIMIT(MySQL)、ROWNUM(Oracle)等原生分页语法,真正只查当前页数据,不加载全表。
引入正确依赖
推荐使用 pagehelper-spring-boot-starter(Spring Boot 项目)或 pagehelper(传统 MyBatis 项目),版本建议 5.3.0+:
- Spring Boot 项目(推荐):
<dependency><br> <groupid>com.github.pagehelper</groupid><br> <artifactid>pagehelper-spring-boot-starter</artifactid><br> <version>5.3.3</version><br></dependency> - 非 Spring Boot 项目:
<dependency><br> <groupid>com.github.pagehelper</groupid><br> <artifactid>pagehelper</artifactid><br> <version>5.3.3</version><br></dependency>
指定数据库方言并启用关键参数
必须显式配置 helper-dialect,避免运行时自动探测带来的性能损耗;其他参数按需开启:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Spring Boot(
application.yml):pagehelper:<br> helper-dialect: mysql<br> reasonable: true<br> support-methods-arguments: true<br> params: count=countSql - 非 Spring Boot(
mybatis-config.xml):
在<plugins></plugins>标签下配置:<plugin interceptor="com.github.pagehelper.PageInterceptor"><br> <property name="helperDialect" value="mysql"></property><br> <property name="reasonable" value="true"></property><br> <property name="supportMethodsArguments" value="true"></property><br></plugin>
调用方式要精准
PageHelper 的分页拦截只对紧随其后的第一个查询生效,调用位置很关键:
- 正确写法(推荐):
PageHelper.startPage(2, 15);<br> List<user> users = userMapper.selectAll();</user> - 支持链式排序:
PageHelper.startPage(1, 20).setOrderBy("create_time DESC"); - 跳过 COUNT 查询(如无限滚动):
PageHelper.startPage(1, 20, false); // 第三个参数为 false - 避免在
startPage()和 Mapper 查询之间插入其他 DB 操作、事务控制或日志打印
封装结果用 PageInfo
PageInfo 不是简单包装 List,它把总记录数、页码、导航数组等一次性带回:
PageInfo<user> pageInfo = new PageInfo(users);</user>- 常用字段:
pageInfo.getTotal()→ 总条数(来自自动触发的 COUNT 查询)pageInfo.getPages()→ 总页数pageInfo.isFirstPage()/pageInfo.isLastPage()→ 边界判断pageInfo.getNavigatepageNums()→ 返回 [1,2,3,4,5] 这类导航页码数组 -
pageInfo.getList()就是当前页数据,无需再subList










