MyBatis是如何进⾏分⻚的?分⻚插件的原理是什么?

🚀 作者主页: 有来技术
🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 仓库主页: Gitee 💫 Github 💫 GitCode
💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

目录

  • 引言
  • MyBatis分页机制
  • MyBatis分页插件原理
    • 拦截器
    • 拦截SQL语句
    • 执行SQL语句
  • 结语
  • 开源项目

引言

MyBatis是一款流行的持久层框架,广泛应用于Java应用程序中。在实际应用中,数据量庞大时,通常需要进行分页查询以提高系统性能和用户体验。本文将深入探讨MyBatis是如何进行分页,并介绍分页插件的原理。

MyBatis分页机制

MyBatis提供了一种简单而灵活的分页机制,通过RowBounds参数和limit语句来实现。当进行分页查询时,可以通过RowBounds参数指定起始行和返回的记录数,同时在SQL语句中使用limit子句限制结果集的大小。

以下是一个简单的MyBatis分页示例:

<select id="selectUsers" resultType="User" parameterType="map">SELECT * FROM usersLIMIT #{offset}, #{limit}
</select>
Map<String, Object> parameterMap = new HashMap<>();
parameterMap.put("offset", 0);
parameterMap.put("limit", 10);
List<User> users = sqlSession.selectList("selectUsers", parameterMap, new RowBounds());

在这个例子中,offset表示起始行,limit表示返回的记录数,通过这两个参数实现了简单的分页查询。

MyBatis分页插件原理

虽然MyBatis本身提供了基本的分页机制,但在实际应用中,很多开发者希望有更强大、灵活的分页功能。为了满足这一需求,社区开发了许多分页插件,其中最为著名的是MyBatis分页插件(如PageHelper)。

分页插件的原理主要是通过拦截MyBatis执行的SQL语句,动态地在原始SQL语句上添加分页相关的语句,实现分页查询的功能。以下是分页插件的核心原理步骤:

拦截器

分页插件通过实现MyBatis的Interceptor接口来创建拦截器。拦截器在MyBatis执行SQL语句前后进行拦截,并能够修改或增强SQL的执行过程。

public class PaginationInterceptor implements Interceptor {// 实现Interceptor接口的方法
}

拦截SQL语句

在拦截器中,通过重写intercept方法,可以获取到执行的SQL语句和参数。在这一步,插件可以根据用户的分页设置,动态地修改原始SQL语句,添加分页相关的语句。

@Override
public Object intercept(Invocation invocation) throws Throwable {// 获取原始SQL语句和参数MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];Object parameter = invocation.getArgs()[1];BoundSql boundSql = mappedStatement.getBoundSql(parameter);// 动态修改原始SQL语句,添加分页相关语句String originalSql = boundSql.getSql();String paginatedSql = addPagination(originalSql);// 将修改后的SQL语句重新设置回去ReflectUtil.setFieldValue(boundSql, "sql", paginatedSql);return invocation.proceed();
}

执行SQL语句

最后,拦截器将修改后的SQL语句传递给下一个拦截器或执行器执行。这样,就实现了在不修改原始Mapper文件的情况下,动态添加了分页功能。

// 继续执行原始的方法
return invocation.proceed();

结语

MyBatis的分页机制通过RowBounds参数和limit语句提供了基本的分页功能。而分页插件则通过拦截器的方式,动态地修改SQL语句,实现了更为灵活和强大的分页功能。使用分页插件,开发者能够更方便地实现各种复杂的分页需求,提高系统性能和用户体验。

希望通过本文的介绍,读者对MyBatis的分页机制和分页插件的原理有更深入的了解。

开源项目

  • SpringCloud + Vue3 微服务商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移动端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 单体权限管理系统
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web服务器之——搭建基于https协议的静态网站

目录 一、HTTPS协议介绍 HTTPS的安全通信机制&#xff1a; 工作流程可大致分为三个阶段&#xff1a; 二、搭建基于https协议的静态网站 第一步&#xff1a;关闭防火墙和SELinux 第二步&#xff1a;安装httpd 准备工作&#xff1a;web服务器搭建 1、挂载 2、编辑配置文…

【机器学习】数据降维

非负矩阵分解(NMF) sklearn.decomposition.NMF找出两个非负矩阵&#xff0c;即包含所有非负元素(W&#xff0c;H)的矩阵&#xff0c;其乘积近似于非负矩阵x。这种因式分解可用于例如降维、源分离或主题提取。 主成分分析(PCA) sklearn.decomposition.PCA使用数据的奇异值分解…

PLC-Recorder V3 修改服务器和客户端通讯端口的方法

PLC-Recorder V3是服务器和客户端的架构&#xff0c;他们之间用TCP通讯。如果客户端无法与服务器建立连接&#xff08;重启也无效&#xff0c;并且确保没有老版本的PLC-Recorder在运行&#xff09;&#xff0c;则可能是端口被占用了。这时候需要修改他们之间的通讯端口&#xf…

Vue 父子组件通信进阶版:深入理解 Props、$emit 和 provide/inject

文章目录 &#x1f351;引言&#x1f351;Props 进阶用法&#x1f347;动态 Props&#x1f347;验证复杂对象 &#x1f351;$emit 进阶用法&#x1f347;传递事件参数&#x1f347;使用修饰符 &#x1f351;provide/inject 进阶用法&#x1f347;动态 provide&#x1f347;通过…

gitlab 通过svn hook 触发

jenkins 起一个item 配置&#xff1a; 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径&#xff0c; 注意是工程&#xff0c;不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器&#xff1a; &#xff0c;重要的是要自…

C练习题_2答案

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述中错误的是(C)A.对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B.数组名代表的是数组所占存储…

【二分查找】【z型搜索】LeetCode240:搜索二维矩阵

LeetCoe240搜索矩阵 本文涉及的基础知识点 二分查找算法合集 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;…

翻译: ChatGPT Token消耗粗略计算英文就是除以四分之三

在这个视频中&#xff0c;我想带你快速浏览一些例子&#xff0c;以建立对在软件应用中使用大型语言模型的实际成本的直观感受。让我们来看看。这是一些示例价格&#xff0c;用于从不同的大型语言模型获取提示和回应&#xff0c;这些模型对开发者可用。即&#xff0c;如果你在你…

11、避免消费者组非必要重平衡的方法

避免消费者组非必要重平衡的方法 1、重平衡的 3 个弊端1.1、影响 consumer 端 TPS1.2、重平衡很慢1.3、重平衡操作效率不高 2、非必要的 2 类 Rebalance2.1、因为 Consumer 没能及时发送心跳请求&#xff0c;导致“被踢出” Group 而引发的。2.2、非必要 Rebalance 是 Consumer…

C#浅拷贝和深拷贝数据

目录 一、浅拷贝 二、深拷贝 一、浅拷贝 就是把原来的数据&#xff0c;复制一份&#xff0c;但是2份数据是共享地址的&#xff0c;修改第一份数据或者修改第二份数据&#xff0c;都会一起改变&#xff0c;这可能不是我们程序中需要的场景。 下面我们演示一下&#xff0c;首…

【BIG_FG_CSDN】C++ 类与对象 (个人向——学习笔记)

基本概念&#xff1a; 类->类型&#xff1b;类描述抽象概念的&#xff1b; 对象->变量&#xff1b;对象描述客观实的&#xff1b; 在进行面向对象程序设计时要先声明类&#xff0c;再创建该类的对象。 为了方便讲述与理解这里我使用一个例题进行讲解吧。 例子&#…

《javaweb——文件上传-分页查询》

1、文件上传 1.文件上传的应用场景&#xff1a;提交作业 上传头像 提交简历&#xff08;上传附件&#xff09; 上传商品&#xff0c;图书图片 2.文件上传的前台如何编写以及注意事项&#xff1a; 1.肯定需要用到表单 2.文件上传的那一栏需…

Vue 自定义搜索输入框SearchInput

效果如下&#xff1a; 组件代码 <template><div class"search-input flex flex-space-between flex-center-cz"><input type"text" v-model"value" :ref"inpuName" :placeholder"placeholder" keyup.enter&…

java 统计中文字符个数能用length吗

在Java中&#xff0c;统计中文字符的个数可以使用length()方法。但是&#xff0c;这只能统计中文字符串的长度&#xff0c;不能判断其中是否包含中文字符。如果你需要统计一个字符串中中文字符的个数&#xff0c;你可能需要使用正则表达式或者其它方式来判断每个字符是否为中文…

【赠书第11期】Unity 3D游戏开发

文章目录 前言 1 Unity 3D简介 2 Unity 3D基本概念 2.1 场景&#xff08;Scene&#xff09; 2.2 游戏对象&#xff08;Game Object&#xff09; 2.3 组件&#xff08;Component&#xff09; 2.4 资源&#xff08;Asset&#xff09; 3 Unity 3D重要组件 3.1 物理引擎 …

HarmonyOS4.0从零开始的开发教程18HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十六&#xff09;HarmonyOS应用/元服务上架 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c…

高性价比AWS Lambda无服务体验

前言 之前听到一个讲座说到AWS Lambda服务&#xff0c;基于Serverless无服务模型&#xff0c;另外官网还免费提供 100 万个请求 按月&#xff0c;包含在 AWS 免费套餐中是真的很香&#xff0c;对于一些小型的起步的网站或者用户量不大的网站&#xff0c;简直就是免费&#xff…

Flink系列之:Top-N

Flink系列之&#xff1a;Top-N 一、TOP-N二、无排名输出优化 一、TOP-N 适用于流、批Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。最小值和最大值集都被认为是Top-N查询。在需要从批表或流表中仅显示 N 个底部或 N 个顶部记录时&#xff0c;Top-N 查询是非常有用…

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

[Spring 从模拟开始学习源码]`@Value`的底层实现

Value 注入主要有三种场景&#xff1a; 注入原始值&#xff0c;比如说注入Value("hello")注入变量&#xff0c;比如Value("${JAVA_HOME}")注入spel表达式&#xff0c;比如Value("#{1 2}") 文章目录 获取 Value内容解析 ${}内容解析 SPEL类型转换…