当前位置: 首页 > news >正文

mybatis是如何进行分页的?分页插件的原理是什么

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理
分页。可以在 sql 内直接拼写带有物理分页的参数来完成物理分页功能,也可以使用分页插件
来完成物 理分页,比如: MySQL 数据的时候,在原有 SQL 后面拼写 limit
分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦
截 待执行的 sql ,然后重写 sql ,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

MyBatis 进行分页的方式主要有两种:使用 RowBounds 和使用分页插件。以下是详细介绍:

### 使用 RowBounds
MyBatis 提供了一个简单的分页解决方案,即通过 `RowBounds` 对象来实现分页。`RowBounds` 包含两个参数:`offset`(偏移量)和 `limit`(每页显示的记录数)。在查询时,MyBatis 会根据这两个参数对查询结果进行分页处理。不过,这种方式的分页是在内存中完成的,可能会导致性能问题。

### 分页插件
分页插件是通过 MyBatis 提供的拦截器机制来实现分页功能的。以常见的 PageHelper 插件为例,其分页原理如下:

#### 拦截器机制
分页插件实现了 MyBatis 的 `Interceptor` 接口,通过拦截器机制对 SQL 语句进行拦截和处理。在执行查询之前,分页插件会自动将下一次查询作为分页查询处理。

#### 分页参数存储
调用分页插件的 `startPage` 方法时,会创建一个 `Page` 对象,将分页参数(如当前页码 `pageNum` 和每页显示条数 `pageSize`)设置到这个 `Page` 对象中。然后,这个 `Page` 对象会被存储到当前线程的 `ThreadLocal` 变量中,以确保分页参数的安全性和准确性。

#### SQL 语句拦截与修改
当 MyBatis 执行查询时,分页插件的拦截器会拦截到 SQL 查询语句。拦截器会获取到 `ThreadLocal` 中保存的分页参数,并根据这些参数和数据库类型(通过方言 `Dialect` 来适配),自动修改原始的 SQL 语句,添加分页相关的 SQL 片段(如 `LIMIT` 语句)来实现分页功能。

#### 执行分页查询
修改后的分页 SQL 语句会被执行,返回分页结果。分页结果会被封装到 `Page` 对象中,包括查询到的数据列表、总记录数等信息。

#### 查询总记录数(可选)
分页插件默认会在执行分页查询之前,先执行一个 `count` 查询来获取总记录数。这个 `count` 查询是通过修改原始 SQL 语句为 `count(*)` 查询来实现的。获取到的总记录数会被设置到 `Page` 对象中。

#### 返回分页结果
执行完分页查询后,分页插件会将分页结果封装到 `Page` 对象中。开发者可以通过 `Page` 对象或将其转换为 `PageInfo` 对象来获取分页查询的结果,包括总记录数、总页数、当前页数据等。

分页插件的实现原理是基于 MyBatis 的插件机制,通过拦截器对 SQL 语句进行动态修改,添加分页相关的条件,从而实现分页功能。这种方式的分页是在数据库层面完成的,性能较好。

 

http://www.dtcms.com/a/118651.html

相关文章:

  • 【学习笔记】HTTP和HTTPS的核心区别及工作原理
  • w283图书商城管理系统
  • Docker全方位指南
  • 嵌入式---加速度计
  • 原子化 CSS 的常见实现框架
  • 微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念
  • 从光波调制到温度补偿:Lilikoi光纤力传感器的核心技术拆解
  • 麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用
  • Glowroot 是一个开源的 Java 应用性能监控(APM)工具,专为 低开销、易用性 设计,具体的应用及优势进行分析说明
  • 【Docker基础-镜像】--查阅笔记2
  • MySQL 查询重写怎样把复杂查询变简单,让查询提高一个“速”!
  • TCP三次握手和TCP四次挥手
  • 7-9 用天平找小球
  • HOW - 设计和实现一个动态渲染不同表单类型组件的 DynamicFormItem 组件
  • SpringBoot框架—Logger使用
  • golang 中 make 和 new 的区别?
  • 力扣刷题——2265.统计值等于子树平均值的节点数
  • 国产三维CAD皇冠CAD在机械制造行业建模教程:油泵
  • [ctfshow web入门] web28
  • 智能仓储数字孪生Demo(Unity实现)
  • AI大模型底层技术——Scaling Law
  • leetcode13.罗马数字转整数
  • 技术面试通关秘籍:常见问题解析+实战案例+避坑指南
  • Java 容器源码分析
  • Java全栈项目--校园快递管理与配送系统(5)
  • Wincc项目被锁定无法打开
  • 红宝书第三十二讲:零基础学会模块打包器:Webpack、Parcel、Rollup
  • 解决.net接口防暴力调用问题
  • 零基础教程:Windows电脑安装Linux系统(双系统/虚拟机)全攻略
  • 特权FPGA之Johnson移位