解决MyBatis分页混乱:PageParam与PageRowBounds深度对比与实战
【免费下载链接】Mybatis-PageHelper Mybatis通用分页插件 项目地址: https://gitcode.com/gh_mirrors/my/Mybatis-PageHelper
你是否还在为MyBatis分页参数传递混乱而头疼?是否在PageHelper插件中纠结于选择PageParam还是PageRowBounds?本文将通过实战案例和源码分析,帮你彻底搞懂这两种分页参数处理方式的差异与适用场景,让分页逻辑从此清晰可控。
项目简介与核心组件
MyBatis-PageHelper是一款功能强大的MyBatis通用分页插件,通过拦截器机制实现物理分页,支持多种数据库方言。项目核心分页参数处理类包括PageParam.java和PageRowBounds.java,分别适用于不同的参数传递场景。
核心文件结构
- 分页参数模型:PageParam.java、PageRowBounds.java
- 分页拦截器:PageInterceptor.java
- 官方使用文档:wikis/zh/HowToUse.md
- 测试案例:PageRowBoundsTest.java
PageParam:面向对象的分页参数模型
PageParam.java是一个实现了IPage接口的抽象分页参数类,通过封装pageNum(页码)、pageSize(每页条数)和orderBy(排序字段)三个核心属性,提供了类型安全的分页参数传递方式。
核心特性
- 类型安全:通过实体类封装分页参数,避免魔法值
- 排序支持:内置orderBy属性,可直接传递排序条件
- 灵活扩展:允许业务类继承扩展自定义参数
基础用法示例
// 创建分页参数对象
PageParam pageParam = new PageParam(1, 10, "id DESC");
// 作为方法参数传递
List<User> users = userMapper.selectByPage(pageParam);
源码解析
public class PageParam implements IPage {
private Integer pageNum; //页码
private Integer pageSize; //每页条数
private String orderBy; //排序条件
//构造函数与getter/setter省略
}
PageRowBounds:基于MyBatis原生的分页实现
PageRowBounds.java继承自MyBatis的RowBounds类,扩展了total(总记录数)和count(是否计数)属性,保留了MyBatis原生的offset(偏移量)和limit(限制条数)分页模式。
核心特性
- 原生兼容:直接适配MyBatis的RowBounds参数规范
- 总数统计:通过total属性返回查询总数
- 零侵入:无需修改Mapper接口定义
基础用法示例
// 创建分页参数对象(offset=0, limit=10)
PageRowBounds pageRowBounds = new PageRowBounds(0, 10);
// 作为参数传递给Mapper方法
List<User> users = userMapper.selectAll(pageRowBounds);
// 获取总数
long total = pageRowBounds.getTotal();
测试案例分析
在PageRowBoundsTest.java中,我们可以看到完整的使用示例:
@Test
public void testMapperWithPageRowBounds() {
SqlSession sqlSession = RowBoundsHelper.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
try {
// 获取第1页,10条内容
PageRowBounds pageRowBounds = new PageRowBounds(0, 10);
List<User> list = userMapper.selectAll(pageRowBounds);
assertEquals(10, list.size());
assertEquals(183L, pageRowBounds.getTotal().longValue());
} finally {
sqlSession.close();
}
}
深度对比:何时选择哪种方式?
| 特性 | PageParam | PageRowBounds |
|---|---|---|
| 继承关系 | 实现IPage接口 | 继承RowBounds类 |
| 参数模式 | 页码+每页条数 | 偏移量+限制条数 |
| 排序支持 | 内置orderBy属性 | 需单独传递参数 |
| 总数获取 | 通过返回Page对象 | 通过对象属性total |
| Mapper侵入 | 需要修改方法参数 | 无需修改方法定义 |
| 适用场景 | 服务层参数传递 | Mapper层原生调用 |
| 扩展能力 | 可继承扩展 | 固定结构 |
场景选择建议
- Controller到Service层:推荐使用PageParam,语义清晰且支持排序
- Service到Mapper层:两种方式均可,PageRowBounds可保持接口兼容性
- 遗留系统改造:优先PageRowBounds,无需修改现有Mapper接口
- 复杂查询场景:PageParam支持更丰富的参数传递
实战配置与最佳实践
1. 插件基础配置
在MyBatis配置文件中添加分页拦截器:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 支持通过Mapper接口参数传递分页参数 -->
<property name="supportMethodsArguments" value="true"/>
<!-- 参数映射配置 -->
<property name="params" value="pageNum=pageNum;pageSize=pageSize;orderBy=orderBy"/>
</plugin>
</plugins>
2. PageParam高级用法
自定义分页参数类:
public class UserQueryParam extends PageParam {
private String username;
private Integer status;
// getter/setter省略
}
// 使用示例
UserQueryParam queryParam = new UserQueryParam(1, 20, "create_time DESC");
queryParam.setUsername("test%");
List<User> users = userMapper.selectByParam(queryParam);
3. PageRowBounds配置技巧
通过配置参数开启RowBounds计数功能:
<property name="rowBoundsWithCount" value="true"/>
<property name="offsetAsPageNum" value="true"/>
rowBoundsWithCount=true:启用总数查询offsetAsPageNum=true:将offset视为pageNum(页码)
常见问题与解决方案
Q1: PageParam参数未生效?
A: 检查是否满足以下条件:
- 配置了
supportMethodsArguments=true - 参数名称与
params配置一致 - 确保分页参数是方法的第一个参数
Q2: PageRowBounds获取total为null?
A: 需要同时配置:
<property name="rowBoundsWithCount" value="true"/>
并确保使用的是PageRowBounds而非原生RowBounds
Q3: 如何在Spring Boot中集成?
A: 使用starter依赖并配置application.properties:
pagehelper.support-methods-arguments=true
pagehelper.params=pageNum=pageNum;pageSize=pageSize
pagehelper.row-bounds-with-count=true
总结与最佳实践
MyBatis-PageHelper提供的两种分页参数处理方式各有侧重:PageParam.java适合面向对象的参数传递,语义清晰且易于扩展;PageRowBounds.java则保留了MyBatis原生风格,零侵入性适合遗留系统。
推荐实践:采用"PageParam(服务层)+ PageRowBounds(数据层)"的分层使用策略,既保证服务层参数传递的清晰性,又保持数据访问层的兼容性。完整使用文档可参考wikis/zh/HowToUse.md,更多测试案例可查看test/java/com/github/pagehelper目录下的测试类。
掌握这两种分页参数处理方式,将帮助你构建更清晰、更灵活的分页逻辑,提升系统可维护性。现在就选择适合你项目的方式,优化你的分页实现吧!
【免费下载链接】Mybatis-PageHelper Mybatis通用分页插件 项目地址: https://gitcode.com/gh_mirrors/my/Mybatis-PageHelper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




