Mybatis的分页实现方式

 更新时间:2025年06月11日 14:59:19   作者:码上心间  
MyBatis 的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧

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分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java对Map进行按value排序的几种常见方法

    Java对Map进行按value排序的几种常见方法

    在日常开发中,Map 是我们经常使用的数据结构之一,尽管 Map 是按键 (key) 存储和检索数据的,但有时我们需要根据 value 进行排序,这篇博客将详细探讨如何在 Java 中对 Map 进行按 value 排序的几种常见方法,并分析它们的优缺点,需要的朋友可以参考下
    2025-03-03
  • Java IO复用_动力节点Java学院整理

    Java IO复用_动力节点Java学院整理

    这篇文章主要介绍了Java IO复用的相关知识,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-05-05
  • SpringBoot中基于JWT的单token授权和续期方案步骤详解

    SpringBoot中基于JWT的单token授权和续期方案步骤详解

    在前后端分离架构中,用户登录后,后端生成JWT Token返给前端存于LocalStorage,每次请求携带Token验证身份,后端校验其有效性,本文给大家介绍SpringBoot中基于JWT的单token授权和续期方案步骤详解,感兴趣的朋友一起看看吧
    2024-09-09
  • SpringBoot整合Netty实现WebSocket的示例代码

    SpringBoot整合Netty实现WebSocket的示例代码

    本文主要介绍了SpringBoot整合Netty实现WebSocket的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 详解java中static关键词的作用

    详解java中static关键词的作用

    这篇文章主要介绍了java中static关键词的作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 浅谈Storm在zookeeper上的目录结构

    浅谈Storm在zookeeper上的目录结构

    这篇文章主要介绍了浅谈Storm在zookeeper上的目录结构的相关内容,涉及storm使用zookeeper的操作以及详细结构图,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java源码解析HashMap简介

    Java源码解析HashMap简介

    今天小编就为大家分享一篇关于Java源码解析HashMap简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 使用java实现字符编码转换(附源码)

    使用java实现字符编码转换(附源码)

    随着全球化的软件应用越来越广泛,不同平台与系统之间的数据交换,常常面临字符集不一致的问题,本文主要介绍了如何使用Java进行字符编码转换,需要的可以了解下
    2025-05-05
  • Java实现FIFO任务调度队列策略

    Java实现FIFO任务调度队列策略

    在工作中,很多高并发的场景中,我们会用到队列来实现大量的任务请求。当任务需要某些特殊资源的时候,我们还需要合理的分配资源,让队列中的任务高效且有序完成任务。本文将为大家介绍通过java实现FIFO任务调度,需要的可以参考一下
    2021-12-12
  • Java框架篇:Spring+SpringMVC+hibernate整合开发

    Java框架篇:Spring+SpringMVC+hibernate整合开发

    本篇文章将会对Spring+SpringMVC+hibernate的整合开发进行介绍。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-02-02

最新评论