MyBatis 实现分页查询常见有以下几种方式,适用于不同的应用场景:
一、使用 SQL 的 LIMIT
语句分页(适用于 MySQL)
这是最常见的方式,直接在 SQL 中添加 LIMIT
子句。
示例:
<select id="selectUserByPage" resultType="User">
SELECT * FROM user
LIMIT #{offset}, #{pageSize}
</select>
说明:
offset = (pageNum - 1) * pageSize
- 需要在调用 SQL 时传入分页参数
二、使用 RowBounds(不推荐)
MyBatis 提供了 org.apache.ibatis.session.RowBounds
类,但它是内存分页,性能差。
示例:
RowBounds rowBounds = new RowBounds(offset, pageSize);
List<User> users = sqlSession.selectList("selectUser", null, rowBounds);
缺点:
- 全表数据先查出来,再在内存中分页
- 数据量大时非常低效
三、使用 PageHelper 插件(推荐)
PageHelper 是 MyBatis 的分页插件,集成简单,功能强大。
示例:
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
优点:
四、使用数据库特定分页语法(如 Oracle)
如果你使用的是 Oracle、SQL Server 等数据库,可以使用它们特定的分页方式。
Oracle 示例:
SELECT * FROM (
SELECT a.*, ROWNUM rnum FROM (
SELECT * FROM user ORDER BY id
) a WHERE ROWNUM <= #{end}
) WHERE rnum > #{start}
总结推荐:
分页方式 | 优点 | 缺点 | 推荐使用 |
---|---|---|---|
LIMIT | 简单易用,适用于 MySQL | 无法自动统计总数 | ✅ 是 |
RowBounds | 集成简单 | 性能差(内存分页) | ❌ 否 |
PageHelper 插件 | 功能强大,支持多数据库 | 需引入第三方依赖 | ✅ 是 |
数据库特定分页语法 | 灵活强大 | 编写复杂,难以通用 | ✅ 有经验可用 |
如你使用 Spring Boot + MyBatis,推荐直接使用 PageHelper 插件。