Mybatis实现数据分页的多种方式详解

 更新时间:2026年08月05日 09:17:06   作者:1加1等于  
还在纠结MyBatis怎么分页,本文详细对比SQL分页、RowBounds、PageHelper等5种实现方式,告诉你物理分页和逻辑分页的区别,并给出大数据量下的分页方案选择建议,帮你避免性能坑,需要的朋友可以参考下

MyBatis 实现数据分页主要有以下几种方式:

1.SQL 分页(手动分页)

在 SQL 语句中直接使用数据库特定的分页语法,如 MySQL 的 LIMITOFFSET,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中多环境管理及配置实战指南

    SpringBoot中多环境管理及配置实战指南

    多环境管理及配置是其一项实用特性,使得开发者能够轻松在不同环境中运行应用,本文将详细介绍 Spring Boot 多环境管理的原理及实战方法,希望对大家有所帮助
    2025-08-08
  • Java的Junit测试框架中的其他注解说明

    Java的Junit测试框架中的其他注解说明

    这篇文章主要介绍了Java的Junit测试框架中的其他注解说明,JUnit是一个开源的java单元测试框架,它是XUnit测试体系架架构的一种体现,
    是Java语言事实上的标准单元测试库,需要的朋友可以参考下
    2023-10-10
  • SpringBoot Knife4j在线API文档框架基本使用

    SpringBoot Knife4j在线API文档框架基本使用

    knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,这篇文章主要介绍了SpringBoot中使用Knife4J在线API文档框架,需要的朋友可以参考下
    2022-12-12
  • IDEA中启动多个SpringBoot服务的实现示例

    IDEA中启动多个SpringBoot服务的实现示例

    本文主要介绍了IDEA中启动多个SpringBoot服务的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 关于跨域无效的问题及解决(java后端方案)

    关于跨域无效的问题及解决(java后端方案)

    这篇文章主要介绍了关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • SpringBoot接收参数使用的注解实例讲解

    SpringBoot接收参数使用的注解实例讲解

    这篇文章主要介绍了详解SpringBoot接收参数使用的几种常用注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • java关于String.split("|")的使用方式

    java关于String.split("|")的使用方式

    这篇文章主要介绍了java关于String.split("|")的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringCloud FeignClient中Bean重复注册冲突解决方案

    SpringCloud FeignClient中Bean重复注册冲突解决方案

    本文详细解析了SpringCloud开发中FeignClientBean重复定义问题,从微服务启动的基础配置讲起,分析了报错根源,并对比了两种主流解决方案的优劣,同时覆盖了有状态/无状态Bean的核心知识点,需要的朋友可以参考下
    2026-03-03
  • JavaFX如何获取ListView(列表视图)的选项

    JavaFX如何获取ListView(列表视图)的选项

    这篇文章主要介绍了JavaFX如何获取ListView(列表视图)的选项,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • JAVA biginteger类bigdecimal类的使用示例学习

    JAVA biginteger类bigdecimal类的使用示例学习

    这篇文章主要为大家介绍了JAVA biginteger类bigdecimal类的使用示例学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论