Mybatis实现数据分页的多种方式详解
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实现数据分页的资料请关注脚本之家其它相关文章!
相关文章
SpringBoot Knife4j在线API文档框架基本使用
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,这篇文章主要介绍了SpringBoot中使用Knife4J在线API文档框架,需要的朋友可以参考下2022-12-12
SpringCloud FeignClient中Bean重复注册冲突解决方案
本文详细解析了SpringCloud开发中FeignClientBean重复定义问题,从微服务启动的基础配置讲起,分析了报错根源,并对比了两种主流解决方案的优劣,同时覆盖了有状态/无状态Bean的核心知识点,需要的朋友可以参考下2026-03-03
JAVA biginteger类bigdecimal类的使用示例学习
这篇文章主要为大家介绍了JAVA biginteger类bigdecimal类的使用示例学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-07-07


最新评论