谈谈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 是最方便高效的选择。然而,对于特殊需求,手动分页或自定义分页插件也是值得考虑的方案。在选择分页方式时,应综合考虑分页的效率、易用性以及项目的具体需求。

相关文章
|
7月前
|
前端开发 JavaScript
【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?
【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?
|
7月前
|
SQL Java 数据库连接
mybatis常见分页技术和自定义分页原理实战
mybatis常见分页技术和自定义分页原理实战
272 0
|
XML Java 数据格式
肝了30天总结,史上最全面透彻的Spring核心原理分析和27道高频面试题
在阅读面试题之前,小伙伴们可以先看看我之前发布的系列文章,Spring核心原理包括源码分析和用30个类手写。面试刷题固然很重要,但是知其然知其所以然更重要。
1605 4
肝了30天总结,史上最全面透彻的Spring核心原理分析和27道高频面试题
|
2月前
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
185 1
|
4月前
|
缓存 监控 前端开发
大量数据如何做分页处理
【8月更文挑战第13天】面对大量数据分页,可从数据库与应用两方面着手:数据库端利用内置分页功能如MySQL的`LIMIT`与`OFFSET`,及SQL Server的`ROW_NUMBER()`;优化查询,精选字段并为常用排序字段加索引。应用端采用缓存已分页数据、异步加载新页及前端懒加载技术。同时限制最大页数并持续监控优化性能,确保高效查询与良好用户体验。
133 0
|
6月前
|
Web App开发 存储 前端开发
技术心得记录:前端面试题汇总
技术心得记录:前端面试题汇总
|
存储 算法 安全
解析 HashMap 源码:深入探究核心方法的实现与原理(上)
解析 HashMap 源码:深入探究核心方法的实现与原理
98 0
|
安全 Java 关系型数据库
解析 HashMap 源码:深入探究核心方法的实现与原理(下)
解析 HashMap 源码:深入探究核心方法的实现与原理(下)
98 0
|
SQL XML Java
谈谈分页插件的配置与使用
组装式开发的核心是一个个可复用的组件,每一个组件中都有一些常用的插件或者工具,在这里简单聊一聊分页插件PageHelper在mybatisplus框架中的使用。
516 0
谈谈分页插件的配置与使用
|
SQL 安全 前端开发
mybatis常见分页技术和自定义分页原理实战(上)
mybatis常见分页技术和自定义分页原理实战(上)
449 0
mybatis常见分页技术和自定义分页原理实战(上)

热门文章

最新文章