重学SpringBoot3-MyBatis的三种分页方式

重学SpringBoot3-MyBatis的三种分页方式

CoderJia 48 2024-03-22

MyBatis 是一个流行的持久层框架,它支持定制 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。分页是 Web 开发中常见的需求,尤其是处理大量数据时,合理的分页可以提高查询效率和用户体验。接下来,将介绍几种常用的 MyBatis 分页方式。

准备工作

环境搭建

参考上一篇文章重学SpringBoot3-整合SSM

SpringBoot3整合SSM结构

数据准备

创建了 users 表,并准备了 15 条记录。

数据准备

未分页效果

未分页查出全部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

分页效果

虽然 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 执行层面实现分页,从而大大提高了分页的效率。

演示

使用PageHelper

分页效果

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

分页效果

这种方式虽然直接且灵活,但需要开发者手动计算偏移量,并且对于不同的数据库,分页的 SQL 语句可能会有所不同。

结论

对于 MyBatis 分页,推荐优先考虑使用物理分页插件如 PageHelper,因为它简单且高效。RowBounds 更适合小规模数据的快速实现,而手动编写分页 SQL 提供了最大的灵活性,适用于特殊需求的场景。在选择分页方式时,需要根据项目的实际需求和数据库的特性来做出决策。