解决MyBatis分页混乱:PageParam与PageRowBounds深度对比与实战

解决MyBatis分页混乱:PageParam与PageRowBounds深度对比与实战

【免费下载链接】Mybatis-PageHelper Mybatis通用分页插件 【免费下载链接】Mybatis-PageHelper 项目地址: https://gitcode.com/gh_mirrors/my/Mybatis-PageHelper

你是否还在为MyBatis分页参数传递混乱而头疼?是否在PageHelper插件中纠结于选择PageParam还是PageRowBounds?本文将通过实战案例和源码分析,帮你彻底搞懂这两种分页参数处理方式的差异与适用场景,让分页逻辑从此清晰可控。

项目简介与核心组件

MyBatis-PageHelper是一款功能强大的MyBatis通用分页插件,通过拦截器机制实现物理分页,支持多种数据库方言。项目核心分页参数处理类包括PageParam.javaPageRowBounds.java,分别适用于不同的参数传递场景。

项目logo

核心文件结构

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();
    }
}

深度对比:何时选择哪种方式?

特性PageParamPageRowBounds
继承关系实现IPage接口继承RowBounds类
参数模式页码+每页条数偏移量+限制条数
排序支持内置orderBy属性需单独传递参数
总数获取通过返回Page对象通过对象属性total
Mapper侵入需要修改方法参数无需修改方法定义
适用场景服务层参数传递Mapper层原生调用
扩展能力可继承扩展固定结构

场景选择建议

  1. Controller到Service层:推荐使用PageParam,语义清晰且支持排序
  2. Service到Mapper层:两种方式均可,PageRowBounds可保持接口兼容性
  3. 遗留系统改造:优先PageRowBounds,无需修改现有Mapper接口
  4. 复杂查询场景: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: 检查是否满足以下条件:

  1. 配置了supportMethodsArguments=true
  2. 参数名称与params配置一致
  3. 确保分页参数是方法的第一个参数

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通用分页插件 【免费下载链接】Mybatis-PageHelper 项目地址: https://gitcode.com/gh_mirrors/my/Mybatis-PageHelper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值