谈谈mybatispllus的分页原理

简介: 【5月更文挑战第23天】MyBatis 是一个流行的持久层框架,它支持自定义 SQL、存储过程以及高级映射。分页是开发中常见的需求,尤其是在处理大量数据时,合理的分页可以有效提升系统性能和用户体验。MyBatis 提供了几种不同的分页方式,本文将对这些方式进行介绍。

MyBatis 是一个流行的持久层框架,它支持自定义 SQL、存储过程以及高级映射。分页是开发中常见的需求,尤其是在处理大量数据时,合理的分页可以有效提升系统性能和用户体验。MyBatis 提供了几种不同的分页方式,本文将对这些方式进行介绍。

分页插件原理

(以 PageHelper 为例)

PageHelper 是基于 MyBatis 的一个拦截器(Interceptor),它通过拦截 MyBatis 执行的 SQL 操作来实现分页功能。其核心原理可以分为以下几个步骤:

  1. 参数解析:当执行查询操作前,PageHelper 通过 ThreadLocal 变量接收分页参数(如当前页码和每页显示的记录数)。
  2. SQL 拦截:在执行 SQL 前,PageHelper 的拦截器会拦截查询操作。拦截器基于 MyBatis 提供的插件接口实现,能够介入查询操作的执行流程。
  3. 构造分页 SQL:拦截器会根据方言(Dialect)针对不同的数据库类型,重写原始 SQL,加入数据库特定的分页语句。例如,对于 MySQL,它会在 SQL 的末尾添加 LIMIT 子句来实现分页。
  4. 执行分页查询:构造好的分页 SQL 被送往数据库执行,数据库返回的结果就是经过分页处理的数据集。
  5. 查询总记录数(可选):如果需要提供分页的总页数、总记录数等信息,PageHelper 还会构造一个查询总记录数的 SQL 语句并执行。这通常是通过移除原始 SQL 中的 ORDER BY 子句,并将 SELECT 子句替换为 SELECT COUNT(1) 来实现的。
  6. 结果处理:最后,分页插件将查询到的数据以及分页相关信息(如总记录数、总页数、当前页码等)封装到 PageInfo 对象中返回给调用者。

PageHelper 的优点

  1. 简单易用:开发者只需添加几行代码即可实现分页,无需修改原有的 SQL 语句。
  2. 高效:PageHelper 生成的分页 SQL 是物理分页,直接由数据库处理,相比逻辑分页(如使用 RowBounds)效率更高。
  3. 灵活:支持多种数据库,自动识别数据库类型并生成相应的分页 SQL。

几种分页方式:


在 MyBatis 中实现分页主要有以下几种方式,每种方式都有其适用场景和优缺点。下面详细介绍这些方法及其实现步骤。

1. 手动分页

手动分页指的是在 SQL 语句中直接使用数据库支持的分页语法(如 MySQL 的 LIMIT 语句)来实现分页。

实现步骤

  1. 在 SQL 语句中添加分页参数。例如,在 MySQL 中,你可以这样编写 SQL:

sql复制代码

SELECT * FROM your_table LIMIT #{offset}, #{pageSize}
  1. 在 Mapper 接口中传递分页参数 offset(起始位置)和 pageSize(每页数量)。

优点:实现简单,控制灵活。

缺点:跨数据库兼容性差,不同数据库分页语法可能不同;大数据量时效率较低,因为没有优化数据查询过程。

2. 使用 RowBounds

RowBounds 是 MyBatis 提供的一个用于分页的工具类,通过它可以在查询时传递分页参数。

实现步骤

  1. 在 Mapper 接口的方法中添加 RowBounds 参数。

java复制代码

List<YourEntity> selectByRowBounds(YourEntity yourEntity, RowBounds rowBounds);
  1. 调用方法时,传入 RowBounds 实例。

java复制代码

int offset = 0; // 起始位置
int limit = 10; // 每页数量
RowBounds rowBounds = new RowBounds(offset, limit);
List<YourEntity> list = mapper.selectByRowBounds(new YourEntity(), rowBounds);

优点:使用简单,无需修改 SQL 语句。

缺点:实际上是逻辑分页,MyBatis 会查询出全部数据然后在内存中进行分页,效率较低,不适用于大数据量的情况。

3. 使用分页插件(如 PageHelper)

PageHelper 是 MyBatis 的一个分页插件,它可以自动将普通的查询转换为分页查询。

实现步骤

  1. 添加 PageHelper 依赖到项目中。

xml复制代码

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>
  1. 配置 PageHelper 插件。在 MyBatis 的配置文件中添加 PageHelper 作为插件。

xml复制代码

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 配置参数 -->
    </plugin>
</plugins>
  1. 在需要分页的查询前,调用 PageHelper 的静态方法 startPage

java复制代码

PageHelper.startPage(pageNum, pageSize);
List<YourEntity> list = mapper.selectByExample(new YourEntityExample());

优点:使用简单,自动化程度高,支持物理分页,适用于大数据量的情况。

缺点:需要引入第三方依赖。


结语

MyBatis 提供了多种分页方式,开发者可以根据实际需求和场景选择最适合的分页方法。对于大多数情况,使用分页插件如 PageHelper 是最方便高效的选择。然而,对于特殊需求,手动分页或自定义分页插件也是值得考虑的方案。在选择分页方式时,应综合考虑分页的效率、易用性以及项目的具体需求。

相关文章
|
1月前
|
缓存
KVCache原理简述
KVCache原理简述
98 0
|
1月前
|
SQL 存储 关系型数据库
MySQL查询原理,看这一篇就够了!
MySQL查询原理,看这一篇就够了!
|
1月前
|
前端开发 JavaScript
工作这么久了,还不懂如何使用纯前端实现分页吗?-假如后端一股脑返回给你所有数据,让你自个实现分页该怎么办
工作这么久了,还不懂如何使用纯前端实现分页吗?-假如后端一股脑返回给你所有数据,让你自个实现分页该怎么办
86 0
|
1月前
|
XML JavaScript 前端开发
大前端JS部分基础面试题(含答案)(一)
大前端JS部分基础面试题(含答案)
|
1月前
|
设计模式 缓存 前端开发
大前端JS部分基础面试题(含答案)(二)
大前端JS部分基础面试题(含答案)(二)
|
6月前
|
前端开发 安全 JavaScript
前端—每天5道面试题(十一)
前端—每天5道面试题(十一)
|
9月前
|
存储 移动开发 前端开发
前端经典面试题 | 性能优化之 懒加载
前端经典面试题 | 性能优化之 懒加载
|
10月前
|
Web App开发 JavaScript 前端开发
前端优化的几种方法和底层原理
前端优化的几种方法和底层原理
|
10月前
|
前端开发
前端学习笔记202305学习笔记第二十二天-后端分页方法1
前端学习笔记202305学习笔记第二十二天-后端分页方法1
39 0
前端学习笔记202305学习笔记第二十二天-后端分页方法1
|
10月前
|
前端开发
前端学习笔记202305学习笔记第二十二天-后端分页方法2
前端学习笔记202305学习笔记第二十二天-后端分页方法2
43 0

热门文章

最新文章