如何编写一个MyBatis插件?
大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助;
如何编写一个MyBatis插件?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
编写 MyBatis 插件需要使用 MyBatis 提供的插件接口,MyBatis 插件机制允许你在执行 SQL 语句时拦截 MyBatis 的 SQL 过程,从而自定义 SQL 执行的行为。插件主要用于以下几个场景:
- 记录日志
- 性能监控
- 权限控制
- SQL 执行前/后的处理
在 MyBatis 中,插件是通过实现 Interceptor 接口来创建的。下面是创建 MyBatis 插件的步骤:
1. 插件的基本概念
MyBatis 插件通过拦截 MyBatis 内部的对象(如 Executor、StatementHandler、ParameterHandler、ResultSetHandler)的行为来增强功能。你可以通过插件来拦截这些对象的方法,从而改变其默认的行为。
- Executor:用于执行 SQL 语句的核心对象。
- StatementHandler:用于处理 SQL 语句的创建、设置参数等操作。
- ParameterHandler:负责设置 SQL 语句的参数。
- ResultSetHandler:用于处理查询结果的转换。
2. 创建插件类
插件需要实现 org.apache.ibatis.plugin.Interceptor 接口。这个接口有一个 intercept 方法,所有的拦截逻辑都需要在该方法中实现。每当 MyBatis 调用相应的目标对象方法时,intercept 方法就会被触发。
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import java.sql.Statement;
import java.util.Properties;public class MyBatisPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 拦截到的目标方法可以进行修改或增强System.out.println("Intercepted method: " + invocation.getMethod().getName());// 调用目标方法Object result = invocation.proceed();// 结果处理(如果需要的话)System.out.println("Result: " + result);return result;}@Overridepublic Object plugin(Object target) {// 这里我们可以为目标对象创建代理if (target instanceof Executor) {return Plugin.wrap(target, this); // 对 Executor 进行包装}return target;}@Overridepublic void setProperties(Properties properties) {// 这里可以读取插件的配置信息(可选)}
}
3. 插件的配置
插件在 MyBatis 配置文件中进行注册。可以通过 mybatis-config.xml 配置文件将插件加入到 MyBatis 的插件链中:
<plugins><plugin interceptor="com.example.plugins.MyBatisPlugin"><!-- 可以配置插件的属性 --><property name="key" value="value"/></plugin>
</plugins>
interceptor属性指定插件类的全限定名。property配置项可用于传递自定义的配置信息给插件(可以是可选的)。
4. 拦截的目标方法
插件会拦截 MyBatis 执行过程中指定的目标对象方法。常见的目标对象包括:
Executor:执行 SQL 的核心接口,包含update、query、commit等方法。StatementHandler:用于处理 SQL 的执行语句、参数设置等。ParameterHandler:负责 SQL 参数的设置。ResultSetHandler:负责结果集的映射和转换。
intercept 方法中的 invocation 参数包含了目标方法的信息,你可以在这个方法中修改参数、执行目标方法前后进行增强。
5. 示例:性能监控插件
一个常见的插件场景是性能监控插件,我们可以通过拦截 SQL 的执行时间来做性能监控。下面是一个简单的示例:
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.executor.Executor;import java.util.Properties;public class PerformanceMonitorPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 记录开始时间long start = System.currentTimeMillis();// 执行目标方法Object result = invocation.proceed();// 记录执行时间long end = System.currentTimeMillis();long time = end - start;if (time > 1000) {System.out.println("SQL execution time exceeded threshold: " + time + "ms");}return result;}@Overridepublic Object plugin(Object target) {if (target instanceof Executor) {return Plugin.wrap(target, this); // 只对 Executor 进行包装}return target;}@Overridepublic void setProperties(Properties properties) {// 可以从配置文件中读取插件的参数}
}
6. 使用插件
在 MyBatis 配置文件中配置你的性能监控插件:
<plugins><plugin interceptor="com.example.plugins.PerformanceMonitorPlugin"/>
</plugins>
7. 插件执行流程
当 MyBatis 执行 SQL 时,会按照以下步骤执行插件:
- 目标对象创建:MyBatis 创建目标对象,如
Executor、StatementHandler等。 - 插件链执行:所有配置的插件会形成一个链条,MyBatis 会依次调用每个插件的
plugin方法。 - 执行拦截:当目标方法被调用时,插件的
intercept方法会被触发,可以在这里修改参数、处理结果或执行其他操作。 - 返回结果:最终,执行的结果会返回给调用者。
8. 总结
编写 MyBatis 插件主要包括以下步骤:
- 实现
Interceptor接口,定义拦截的逻辑。 - 在 MyBatis 配置文件中注册插件。
- 根据需要对目标对象进行包装和增强。
- 使用插件来实现如性能监控、日志记录、权限控制等功能。
通过插件,你可以在不修改 MyBatis 源码的情况下,增加新的功能或行为,非常适用于一些跨领域的功能,如监控、日志、缓存等。
相关文章:
如何编写一个MyBatis插件?
大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助; 如何编写一个MyBatis插件? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 编写 MyBatis 插件需要使用 MyBatis 提供的插件接口,MyBa…...
验证二叉搜索树(力扣98)
根据二叉搜索树的特性,我们使用中序遍历,保证节点按从小到大的顺序遍历。既然要验证,就是看在中序遍历的条件下,各个节点的大小关系是否符合二叉搜索树的特性。双指针法和适合解决这个问题,一个指针指向当前节点&#…...
C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】
1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。 输入描述:Lily使用的图片包括 “A…...
Golang Gin系列-7:认证和授权
在本章中,我们将探讨Gin框架中身份验证和授权的基本方面。这包括实现基本的和基于令牌的身份验证,使用基于角色的访问控制,应用中间件进行授权,以及使用HTTPS和漏洞防护保护应用程序。 实现身份认证 Basic 认证 Basic 认证是内置…...
mysql create table的用法
在MySQL中创建表的基本语法如下: CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,... );这里是一个例子,假设我们要创建一个名为employees的表,包含以下字段: id:一个整数类型的主键…...
蓝桥杯算法赛第25场月赛
前言 这些题对于我的难度有点大,大家感兴趣的可以来做一下,看一下,下面给大家展示一下题目 1. 桃花运走向【算法赛】 问题描述 2025 年春节,小明和小红兴致勃勃地去庙会玩耍。庙会上,一个算命先生摆摊算命…...
从介词到状语 (什么都研究一点系列)
契子 英语中介词的使用频率很高, 但在使用时本质上作为状语而成为句子成分, 没错 “本质上” 这三个字就是状语 😃 形式上是这样: 介词 -> 状语 -> 句子 常见的介词: 时间 at, 地点 on, 原因 of, 方式 in, 伴随 with, 比较 than, 条件 if 等等 下面我们开…...
CVE-2025-0411 7-zip 漏洞复现
文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 此漏洞 (CVSS SCORE 7.0) 允许远程攻击者绕…...
java入门笔记基础语法篇(4)
变量 在Java中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量 名之前。例如: int days; double salary; long earthPopulation; boolean done; 在Java中,每个声明以分号结束。变量名必须…...
学习数据结构(1)时间复杂度
1.数据结构和算法 (1)数据结构是计算机存储、组织数据的方式,指相互之间存在⼀种或多种特定关系的数据元素的集合 (2)算法就是定义良好的计算过程,取一个或一组的值为输入,并产生出一个或一组…...
存储基础 -- SCSI命令格式与使用场景
SCSI命令格式与使用场景 1. SCSI命令描述符块(CDB) 1.1 CDB基本概念 SCSI命令通过**命令描述符块(CDB, Command Descriptor Block)**表示。 CDB长度:SCSI命令根据使用场景有不同长度的CDB,常见的有6字节…...
PyTorch广告点击率预测(CTR)利用深度学习提升广告效果
目录 广告点击率预测问题数据集结构广告点击率预测模型的构建1. 数据集准备2. 构建数据加载器3. 构建深度学习模型4. 训练与评估 总结 广告点击率预测(CTR,Click-Through Rate Prediction)是在线广告领域中的重要任务,它帮助广告平…...
算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)
🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧💪 在算法的…...
Flutter TextPainter 计算文本高度和行数
在开发中有的时候需要去计算文本的高度或者行数,从而控制展示的内容,比如进一步设置展示控件的高度,或者根据行数进行不同的内容展示。 在原生 Android 开发时,View 的绘制流程分为 measure,layout,draw 三…...
STM32-时钟树
STM32-时钟树 时钟 时钟...
算法知识补充2
一部分:Tire树:高效地存储和查找字符串集合的数据结构acwing835 #include<iostream> #include<cstring> using namespace std; const int N100010; int son[N][26],cnt[N],idx; char str[N]; void insert(char str[]){int p0;for(int i0;st…...
微信小程序-点餐(美食屋)02开发实践
目录 概要 整体架构流程 (一)用户注册与登录 (二)菜品浏览与点餐 (三)订单管理 (四)后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…...
WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用
WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用 一、前言二、Button 控件基础2.1 Button 的基本定义与显示2.2 按钮样式设置2.3 按钮大小与布局 三、Button 的交互功能3.1 点击事件处理3.2 鼠标悬停与离开效果3.3 按钮禁用与启用 四、TextBox 控件基础4.…...
CentOS7使用源码安装PHP8教程整理
CentOS7使用源码安装PHP8教程整理 下载安装包解压下载的php tar源码包安装所需的一些依赖扩展库安装前的配置修改配置文件1、进入php8的安装包 配置环境变量开机自启启动服务创建软连接常见问题1、checking for icu-uc > 50.1 icu-io icu-i18n... no2、configure: error: Pa…...
强化学习 - 基于策略搜索和策略优化: 高斯策略
最近在做毕设需要用强化学习来做控制,对强化学习的知识点做一下总结。 高斯策略 高斯策略属于强化学习中的基于策略优化的分支(Policy Optimization),尤其是策略梯度方法(Policy Gradient Methods) 的一部…...
126周日复盘 (166)本周回顾
关键词:帧数测试 1、上午继续各处排查,优化帧数。 中午打包测试。 显卡锁60帧,720p窗口模式,画质3下, 低负载时50-60帧,密集战斗时35-45帧,基本达到预期, 硬件占用,显…...
08-Elasticsearch
黑马商城作为一个电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。 首先,查询效率较低。 由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很…...
SQL在DBA手里-改写篇
背景 最近运营需要做月报汇总交易情况,之前一直是他们手工出的数据,他们想做成月初自动发送邮件,从而减轻他们的工作量。于是他们提供SQL我们在邮件服务器配置做定时发送任务。 表介绍(表及字段已做脱敏处理) trans…...
02-机器学习-核心概念
以下是机器学习核心概念的详细梳理。 1. 机器学习三大范式 类型定义典型应用监督学习使用带标签的数据训练模型,预测未知数据的标签。分类(邮件垃圾过滤)、回归(房价预测)无监督学习从无标签的数据中发现隐藏模式或结…...
企业财务管理系统的需求设计和实现
该作者的原创文章目录: 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…...
Couchbase UI: Server
在 Couchbase UI 中的 Server(服务器)标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍: 1. 节点列表 显示集群中所有节点的列表,每个节点的详细信息包括: 节点地址࿱…...
【软件设计师中级】-笔记缩减版本-计算机系统基础知识
1. 计算机系统基础知识 1.1. 计算机系统硬件基本组成硬件 中央处理器(CPU)硬件系统的核心 运算器 控制器 存储器(记忆设备) 内部存储器(速度高,容量小):临时存放程序、数据及中间结…...
SAP MM 记录一次SAP外协采购收货提示 这种物料的特殊库存 O 0100003359 14019002不存在的问题
根据采购订单收货,调用时 BAPI_GOODSMVT_CREATE时返回 { "TYPE":"E", "ID":"M7", "NUMBER":"076", "MESSAGE":"这种物料的特殊库存 O 0100003359 14019002不存在"…...
2025牛客寒假算法基础集训营2
H 一起画很大的圆! 看起来像是一道计算几何的题,实际上通过分析和猜想,是有O1复杂度的结论的。具体证明略,结论是三点越接近共线,得出的半径越大。 #include <bits/stdc.h> using namespace std; #define endl \…...
统计学中的样本概率论中的样本
不知道当初谁想的把概率论和数理统计合并,作为一门课。这本身是可以合并,完整的一条线,看这里。但是,作为任课老师应该从整体上交代清楚,毕竟是两个学科,不同的学科合并必然会有各种不协调的问题。 举个最…...
