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);

优点:

  • 自动拦截 SQL 语句,添加分页语法
  • 支持多种数据库MySQL、Oracle、PostgreSQL 等)
  • 支持排序、总记录数统计等

四、使用数据库特定分页语法(如 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 插件。