mybatis 的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异:
1. 原生 sql 分页(物理分页)
原理:直接在 sql 中编写数据库特定的分页语法(如 mysql 的 limit
、oracle 的 rownum
)。
示例:
<select id="selectusers" resulttype="user"> select * from users limit #{offset}, #{pagesize} </select>
优点:
- 性能最优,直接通过数据库物理分页,仅查询所需数据。
- 无额外依赖,适用于简单场景。
缺点:
- sql 与数据库类型绑定,切换数据库需修改 sql。
- 需要手动计算分页参数(offset、pagesize)。
2. rowbounds 分页(逻辑分页)
原理:通过 mybatis 的 rowbounds
对象实现内存分页(逻辑分页)。查询时会获取全部数据,但在内存中截取指定范围。
示例:
list<user> users = sqlsession.selectlist("selectusers", null, new rowbounds(offset, pagesize));
优点:
- 代码简单,无需修改 sql。
- 兼容所有数据库。
缺点:
- 性能差:数据量大时会导致内存溢出或查询缓慢(需全量加载数据)。
- 仅适用于小数据集。
3. pagehelper 插件(推荐)
原理:通过拦截器动态修改 sql,自动添加分页语句(物理分页)。支持多种数据库,并封装分页结果(总条数、页码等)。
使用步骤:
引入依赖:
<dependency> <groupid>com.github.pagehelper</groupid> <artifactid>pagehelper</artifactid> <version>5.3.0</version> </dependency>
配置拦截器(mybatis 配置文件中):
<plugins> <plugin interceptor="com.github.pagehelper.pageinterceptor"> <property name="helperdialect" value="mysql"/> <!-- 指定数据库类型 --> </plugin> </plugins>
代码调用:
// 开启分页 pagehelper.startpage(pagenum, pagesize); list<user> users = usermapper.selectusers(); // 封装分页结果 pageinfo<user> pageinfo = new pageinfo<>(users);
优点:
- 自动适配不同数据库的分页语法(如 mysql、oracle、postgresql)。
- 提供
pageinfo
对象,包含总记录数、总页数、当前页等分页信息。 - 对代码侵入性低。
缺点:
- 需要引入第三方依赖。
4. mybatis-plus 分页插件
原理:mybatis-plus 是 mybatis 的增强工具,内置分页插件,通过拦截器实现物理分页。
使用步骤:
引入依赖:
<dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-boot-starter</artifactid> <version>3.5.3.1</version> </dependency>
配置分页插件:
@configuration public class mybatisplusconfig { @bean public mybatisplusinterceptor mybatisplusinterceptor() { mybatisplusinterceptor interceptor = new mybatisplusinterceptor(); interceptor.addinnerinterceptor(new paginationinnerinterceptor(dbtype.mysql)); return interceptor; } }
代码调用:
// 创建分页参数 page<user> page = new page<>(pagenum, pagesize); // 执行分页查询 page<user> result = usermapper.selectpage(page, null); // 获取分页信息 long total = result.gettotal(); list<user> users = result.getrecords();
优点:
- 与 mybatis-plus 深度集成,支持更丰富的 crud 操作。
- 自动处理分页逻辑,返回包含分页信息的
page
对象。
5. 自定义分页拦截器
- 原理:手动实现 mybatis 的
interceptor
接口,动态修改 sql 添加分页逻辑。 - 适用场景:
- 需要高度定制化分页逻辑(如特殊的分页规则)。避免引入第三方依赖。
缺点:
- 开发成本高,需处理不同数据库的语法差异。
分页方案对比
方案 | 性能 | 数据库兼容性 | 代码侵入性 | 适用场景 |
---|---|---|---|---|
原生 sql 分页 | 高 | 低(需手动适配) | 高 | 简单查询、固定数据库类型 |
rowbounds | 低 | 高 | 低 | 小数据集、逻辑分页 |
pagehelper | 高 | 高 | 低 | 通用场景,推荐使用 |
mybatis-plus | 高 | 高 | 中 | 使用 mybatis-plus 的项目 |
自定义拦截器 | 高 | 可定制 | 高 | 特殊需求 |
总结
- 推荐方案:优先使用 pagehelper 或 mybatis-plus 分页插件,二者均通过物理分页实现高性能,且对代码侵入性低。
- 性能陷阱:避免使用
rowbounds
处理大数据集,可能导致内存溢出。 - 数据库兼容性:若项目需支持多数据库,选择 pagehelper 或 mybatis-plus,它们能自动适配不同数据库的分页语法。
到此这篇关于mybatis是如何进行分页的的文章就介绍到这了,更多相关mybatis分页内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论