MyBatis 是一个流行的持久层框架,它支持定制 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。分页是 Web 开发中常见的需求,尤其是处理大量数据时,合理的分页可以提高查询效率和用户体验。接下来,将介绍几种常用的 MyBatis 分页方式。
准备工作
环境搭建
参考上一篇文章重学SpringBoot3-整合SSM
数据准备
创建了 users 表,并准备了 15 条记录。
未分页效果
1. 使用MyBatis自带的RowBounds进行分页
RowBounds
是 MyBatis 提供的用于分页的一个简单工具,它通过 Java 代码的方式来实现分页功能。使用 RowBounds
时,只需要在 Mapper 的方法中添加 RowBounds
参数即可。
List<YourModel> selectByRowBounds(YourExample example, RowBounds rowBounds);
然后,在调用 Mapper 方法时传入 RowBounds
对象,其中包含了偏移量(offset)和限制量(limit)。
int offset = 0; // 起始位置
int limit = 10; // 每页显示的数据条数
RowBounds rowBounds = new RowBounds(offset, limit);
List<YourModel> list = yourMapper.selectByRowBounds(example, rowBounds);
演示
虽然 RowBounds
简单易用,但它并不是一种高效的分页方式,因为它是通过在数据库返回全部结果之后,在内存中进行分页处理,这在处理大量数据时会非常低效。
2. 使用物理分页插件
由于 RowBounds
的局限性,很多项目会选择使用物理分页插件如 PageHelper 来实现更高效的分页。PageHelper 是国内开发者为 MyBatis 定制的一个非常流行的分页插件,它能够实现真正意义上的物理分页。
首先引入 PageHelper 依赖最新版:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
使用 PageHelper 非常简单,只需要在你的查询方法前调用 PageHelper.startPage
方法,传入页码和每页数量即可。
PageHelper.startPage(1, 10); // 页码,每页数量
List<YourModel> list = yourMapper.selectByExample(example);
PageHelper 会自动的对接下来的第一个 MyBatis 查询进行分页处理。它通过改写原 SQL 语句,在 SQL 执行层面实现分页,从而大大提高了分页的效率。
演示
3. 手动编写分页SQL
另外一种方式是直接在 SQL 语句中写入分页的逻辑,这通常适用于一些特定需求的情况,或者是在一些不想引入额外插件的项目中。
例如,在 MySQL 中可以使用 LIMIT
语句实现分页:
SELECT * FROM your_table LIMIT #{offset}, #{limit}
在 Mapper 的 XML 文件或注解中,可以这样使用:
@Select("SELECT * FROM your_table LIMIT #{offset}, #{limit}")
List<YourModel> selectByPage(@Param("offset") int offset, @Param("limit") int limit);
演示
这种方式虽然直接且灵活,但需要开发者手动计算偏移量,并且对于不同的数据库,分页的 SQL 语句可能会有所不同。
结论
对于 MyBatis 分页,推荐优先考虑使用物理分页插件如 PageHelper,因为它简单且高效。RowBounds
更适合小规模数据的快速实现,而手动编写分页 SQL 提供了最大的灵活性,适用于特殊需求的场景。在选择分页方式时,需要根据项目的实际需求和数据库的特性来做出决策。