在 MyBatis 中,分页是一个常见的需求。
MyBatis 本身并没有直接提供分页功能,但可以通过以下几种方式实现分页。
此外,MyBatis 的分页插件(如 PageHelper)可以简化分页操作。下面我们详细分析 MyBatis 的分页实现方式以及分页插件的原理。
1. MyBatis 分页的实现方式
(1)手动分页
-
在 SQL 语句中使用数据库的分页语法(如
LIMIT
、OFFSET
或ROWNUM
)实现分页。 -
示例(MySQL):
SELECT * FROM user LIMIT #{offset}, #{pageSize}
-
-
offset
:起始位置。 -
pageSize
:每页的记录数。
-
(2)Java 代码分页
-
在 Java 代码中手动截取查询结果的一部分作为分页数据。
-
示例:
List<User> users = userMapper.selectAllUsers();
List<User> pageUsers = users.subList((pageNum - 1) * pageSize, pageNum * pageSize);
-
-
pageNum
:当前页码。 -
pageSize
:每页的记录数。
-
(3)RowBounds 分页
-
MyBatis 提供了
RowBounds
类,可以在查询时指定分页范围。 -
示例:
RowBounds rowBounds = new RowBounds((pageNum - 1) * pageSize, pageSize);
List<User> users = sqlSession.selectList("selectAllUsers", null, rowBounds);
-
-
RowBounds
的分页是在内存中进行的,不适合大数据量分页。
-
2. MyBatis 分页插件(如 PageHelper)
(1)分页插件的原理
-
分页插件通过拦截 MyBatis 的
Executor
,在 SQL 执行前动态修改 SQL 语句,添加分页逻辑。 -
插件会拦截查询方法,自动计算分页参数(如
offset
和pageSize
),并生成分页 SQL。
(2)PageHelper 的使用
1. 引入依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
2. 配置插件:
在 MyBatis 配置文件中配置 PageHelper 插件:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
3. 使用分页:
在查询方法前调用 PageHelper.startPage
,即可实现分页。
PageHelper.startPage(pageNum, pageSize); // 设置分页参数
List<User> users = userMapper.selectAllUsers(); // 执行查询
PageInfo<User> pageInfo = new PageInfo<>(users); // 获取分页信息
(3)PageHelper 的分页原理
-
拦截 SQL:PageHelper 拦截 MyBatis 的
Executor
,在 SQL 执行前动态修改 SQL 语句。 -
生成分页 SQL:根据数据库方言(如 MySQL、Oracle)生成分页 SQL。
-
MySQL:
-
SELECT * FROM user LIMIT #{offset}, #{pageSize}
Oracle:
SELECT * FROM (SELECT ROWNUM rn, t.* FROM user t WHERE ROWNUM <= #{endRow}) WHERE rn >= #{startRow}
-
返回分页结果:将分页结果封装到
PageInfo
对象中,包含分页信息和数据列表。
3. 分页插件的优点
(1)简化分页操作
-
分页插件自动处理分页逻辑,开发者只需关注业务逻辑。
(2)支持多种数据库
-
分页插件支持多种数据库方言(如 MySQL、Oracle、PostgreSQL 等)。
(3)灵活配置
-
可以通过配置文件或代码灵活设置分页参数。
4. 总结
分页方式 | 说明 |
---|---|
手动分页 | 在 SQL 语句中使用数据库的分页语法。 |
Java 代码分页 | 在 Java 代码中手动截取查询结果。 |
RowBounds 分页 | 使用 MyBatis 的 RowBounds 类进行内存分页。 |
分页插件 | 使用 PageHelper 等分页插件,自动生成分页 SQL,简化分页操作。 |
5. 一句话总结
MyBatis 可以通过手动分页、Java 代码分页、RowBounds
分页或分页插件实现分页,分页插件通过拦截 SQL 并动态生成分页逻辑,简化了分页操作。