MyBatis(7)MyBatis 是如何进行分页

MyBatis 本身没有内置的分页处理,但它提供了使用分页插件或通过手动编写分页SQL语句的机制来实现分页功能。分页插件如 PageHelper 是常用来与 MyBatis 配合进行分页的工具。

手动分页

在不使用分页插件的情况下,可以通过编写特定的分页SQL语句来手动实现分页。以MySQL数据库为例,通常会使用 LIMIT 子句来实现分页。

SELECT * FROM some_table
LIMIT #{offset}, #{pageSize}

在 MyBatis 的映射文件中或使用注解方式,你可以这样写:

<select id="selectPaged" resultType="com.example.MyObject">
  SELECT * FROM some_table
  LIMIT #{offset}, #{pageSize}
</select>

或者使用注解:

@Select("SELECT * FROM some_table LIMIT #{offset}, #{pageSize}")
List<MyObject> selectPaged(@Param("offset") int offset, @Param("pageSize") int pageSize);

在执行查询时,你需要计算 offset(偏移量)和 pageSize(每页数量)的值。

int pageSize = 10;
int pageNumber = 1;
int offset = (pageNumber - 1) * pageSize;
List<MyObject> pagedList = mapper.selectPaged(offset, pageSize);
使用 PageHelper 分页

PageHelper 是一个第三方的 MyBatis 分页插件。它通过拦截 MyBatis 的查询操作来自动添加分页语句。使用 PageHelper 的基本步骤如下:

  1. 在项目中包含 PageHelper 依赖。

  2. 配置 MyBatis 插件来使用 PageHelper。

  3. 在代码中使用 PageHelper 的静态方法来设置分页参数。

  4. 执行查询。

在 MyBatis 配置文件中配置 PageHelper:

<plugins>
  <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <property name="helperDialect" value="mysql"/>
    <!-- 其他配置 -->
  </plugin>
</plugins>

使用 PageHelper 进行分页:

// 设置分页参数
PageHelper.startPage(pageNumber, pageSize);
// 执行查询
List<MyObject> pagedList = mapper.selectSome();
// 获取分页信息
PageInfo<MyObject> pageInfo = new PageInfo<>(pagedList);
PageHelper 源码分析

PageHelper 使用了 MyBatis 提供的插件接口(Interceptor)来实现其功能。通过拦截 Executor.query() 方法,PageHelper 在执行查询之前修改 SQL 语句,添加上分页的相关信息。

public Object intercept(Invocation invocation) throws Throwable {
  // 中间省略部分代码
  MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
  Object parameter = invocation.getArgs()[1];
  RowBounds rowBounds = (RowBounds) invocation.getArgs()[2];
  // 省略部分判断逻辑
  // 获取分页参数
  Page page = PageHelper.getLocalPage();
  // ... 对 SQL 进行处理,添加分页参数
  // 省略具体实现
  // 执行原查询
  Object result = invocation.proceed();
  // 设置分页信息
  page.addAll((List) result);
  // ...
  return result;
}

PageHelper 会根据方言(如 MySQL、Oracle 等)来生成相应的分页 SQL。在执行查询方法前,PageHelper.startPage() 方法会设置本地线程变量,其中包含分页参数。当查询方法执行时,插件拦截并识别这些参数,然后改写 SQL 语句,最终执行的是已经添加了分页子句的 SQL 语句。

细节和最佳实践
  1. 在手动编写分页SQL时,应优先选择使用数据库的分页特性,如 MySQL 的 LIMIT

  2. PageHelper 是一个非侵入式的分页插件,可以很容易地集成到现有的 MyBatis 应用中。

  3. 使用 PageHelper 可以避免写大量的分页代码,提高开发效率。

  4. 应优先使用 startPage 方法进行分页,它比使用 RowBounds 更高效,因为 RowBounds 是通过在内存中进行分页处理,而 startPage 生成的 SQL 会直接在数据库层面上限制结果集大小。

  5. 在分布式环境下,考虑分页查询的性能和数据一致性问题。如果数据量大,考虑使用更高效的数据分页策略。

总之,MyBatis 分页可以通过手动编写SQL或使用分页插件来实现。在实际应用中,选用 PageHelper 这种分页插件通常能够提供更简单、更高效的分页实现。

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

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

抵扣说明:

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

余额充值