mybatis 实现数据分页主要有以下几种方式:
1.sql 分页(手动分页)
在 sql 语句中直接使用数据库特定的分页语法,如 mysql 的 limit 和 offset,oracle 的 rownum 等。
示例(mysql):
select * from users limit #{offset}, #{pagesize};- 优点:简单直接,无需额外依赖。
- 缺点:需手动计算偏移量,sql 与数据库强绑定,移植性差。
2.rowbounds 分页(逻辑分页)
mybatis 内置的 rowbounds 类可在 java 代码中指定分页参数:
rowbounds rowbounds = new rowbounds(offset, pagesize);
list<user> users = sqlsession.selectlist("usermapper.selectall", null, rowbounds);
- 优点:代码简洁,无需修改 sql。
- 缺点:先查询全量数据再内存分页,大数据量时性能差。
3.分页插件(物理分页)
通过拦截器在 sql 执行前动态添加分页逻辑,如 pagehelper(主流方案)。
pagehelper 使用步骤:
添加依赖(maven):
<dependency>
<groupid>com.github.pagehelper</groupid>
<artifactid>pagehelper-spring-boot-starter</artifactid>
<version>最新版本</version>
</dependency>配置插件(自动配置或手动):
@configuration
public class mybatisconfig {
@bean
public pageinterceptor pageinterceptor() {
return new pageinterceptor();
}
}
业务代码中使用:
// 开启分页,后续查询会自动添加分页逻辑 pagehelper.startpage(pagenum, pagesize); list<user> users = usermapper.selectall(); // 获取分页信息 pageinfo<user> pageinfo = new pageinfo<>(users);
- 优点:透明化分页逻辑,支持多种数据库,性能优。
- 缺点:需引入依赖,可能有版本兼容问题。
4.自定义拦截器
通过实现 interceptor 接口自定义分页逻辑,适用于复杂场景:
@intercepts({@signature(type = executor.class, method = "query",
args = {mappedstatement.class, object.class, rowbounds.class, resulthandler.class})})
public class custompageinterceptor implements interceptor {
@override
public object intercept(invocation invocation) throws throwable {
// 动态修改 sql,添加分页逻辑
// ...
return invocation.proceed();
}
}
5.流式查询(大数据量分页)
使用 mybatis 的 cursor<t> 接口逐行处理数据,避免一次性加载全量数据:
try (cursor<user> cursor = usermapper.selectbycursor()) {
for (user user : cursor) {
// 处理数据
}
}
分页方案选择建议:
- 小数据量:sql 分页或 rowbounds。
- 大数据量:分页插件(如 pagehelper)或自定义拦截器。
- 复杂场景:自定义拦截器或流式查询。
注意事项:
- 物理分页性能优于逻辑分页。
- 分页插件可能影响复杂 sql 的执行,需谨慎使用。
- 不同数据库的分页语法不同,切换数据库时需注意兼容性。
以上就是mybatis实现数据分页的多种方式详解的详细内容,更多关于mybatis实现数据分页的资料请关注代码网其它相关文章!
发表评论