电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

mybatis 自定義實現攔截器插件Interceptor示例

瀏覽:2日期:2023-10-21 19:58:02

首先熟悉一下Mybatis的執行過程,如下圖:

mybatis 自定義實現攔截器插件Interceptor示例

類型

先說明Mybatis中可以被攔截的類型具體有以下四種:

1.Executor:攔截執行器的方法。2.ParameterHandler:攔截參數的處理。3.ResultHandler:攔截結果集的處理。4.StatementHandler:攔截Sql語法構建的處理。

規則

Intercepts注解需要一個Signature(攔截點)參數數組。通過Signature來指定攔截哪個對象里面的哪個方法。@Intercepts注解定義如下:

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface Intercepts { /** * 定義攔截點 * 只有符合攔截點的條件才會進入到攔截器 */ Signature[] value();}

Signature來指定咱們需要攔截那個類對象的哪個方法。定義如下:

@Documented@Retention(RetentionPolicy.RUNTIME)@Target({})public @interface Signature { /** * 定義攔截的類 Executor、ParameterHandler、StatementHandler、ResultSetHandler當中的一個 */ Class<?> type(); /** * 在定義攔截類的基礎之上,在定義攔截的方法 */ String method(); /** * 在定義攔截方法的基礎之上在定義攔截的方法對應的參數, * JAVA里面方法可能重載,故注意參數的類型和順序 */ Class<?>[] args();}

標識攔截注解@Intercepts規則使用,簡單實例如下:

@Intercepts({//注意看這個大花括號,也就這說這里可以定義多個@Signature對多個地方攔截,都用這個攔截器 @Signature( type = ResultSetHandler.class, method = 'handleResultSets', args = {Statement.class}), @Signature(type = Executor.class, method = 'query', args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})

說明:@Intercepts:標識該類是一個攔截器;@Signature:指明自定義攔截器需要攔截哪一個類型,哪一個方法;- type:上述四種類型中的一種;- method:對應接口中的哪類方法(因為可能存在重載方法);- args:對應哪一個方法的入參;

method中對應四種的類型的方法:

攔截類型 攔截方法 Executor update, query, flushStatements, commit, rollback,getTransaction, close, isClosed ParameterHandler getParameterObject, setParameters StatementHandler prepare, parameterize, batch, update, query ResultSetHandler handleResultSets, handleOutputParameters

介紹

談到自定義攔截器實踐部分,主要按照以下三步:

實現org.apache.ibatis.plugin.Interceptor接口,重寫以下方法:

public interface Interceptor { Object intercept(Invocation var1) throws Throwable; Object plugin(Object var1); void setProperties(Properties var1);}

添加攔截器注解@Intercepts{...}。具體值遵循上述規則設置。

配置文件中添加攔截器。

intercept(Invocation invocation)

從上面我們了解到interceptor能夠攔截的四種類型對象,此處入參invocation便是指攔截到的對象。舉例說明:攔截**StatementHandler#query(Statement st,ResultHandler rh)**方法,那么Invocation就是該對象。

plugin(Object target)

這個方法的作用是就是讓mybatis判斷,是否要進行攔截,然后做出決定是否生成一個代理。

@Override public Object plugin(Object target) { //判斷是否攔截這個類型對象(根據@Intercepts注解決定),然后決定是返回一個代理對象還是返回原對象。//故我們在實現plugin方法時,要判斷一下目標類型,如果是插件要攔截的對象時才執行Plugin.wrap方法,否則的話,直接返回目標本身。 if (target instanceof StatementHandler) { return Plugin.wrap(target, this); } return target; }

注意:每經過一個攔截器對象都會調用插件的plugin方法,也就是說,該方法會調用4次。根據@Intercepts注解來決定是否進行攔截處理。

setProperties(Properties properties)

攔截器需要一些變量對象,而且這個對象是支持可配置的。

實戰

自定義攔截器

@Intercepts(value = {@Signature(type = StatementHandler.class, method = 'prepare', args = {Connection.class, Integer.class})})public class MyInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); BoundSql boundSql = statementHandler.getBoundSql(); Object obj = boundSql.getParameterObject(); String sql = boundSql.getSql(); if (sql.trim().toUpperCase().startsWith('INSERT')) { ReflectUtil.setFieldValue(obj, 'rev', 0); ReflectUtil.setFieldValue(obj, 'createTime', new Date()); ReflectUtil.setFieldValue(obj, 'operateTime', new Date()); ReflectUtil.setFieldValue(boundSql,'parameterObject', obj); } else if (sql.trim().toUpperCase().startsWith('UPDATE')) { sql = sql.replaceAll(' set ', ' SET ') .replaceAll(' Set ', ' SET ') .replaceAll(' SET ', ' SET rev = rev+1, operate_time = NOW(), '); ReflectUtil.setFieldValue(boundSql,'sql', sql); } return invocation.proceed(); } @Override public Object plugin(Object o) { return Plugin.wrap(o, this); } @Override public void setProperties(Properties properties) { }}

主要看下核心代碼方法intercept():這段代碼主要目的:攔截insert和update語句,利用反射機制,設置insert語句的參數rev(版本號,利用樂觀鎖),第一次查詢,故創建時間和操作時間相同;update是將版本號+1,統一修改其操作時間。

mybatis-config

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE configuration PUBLIC '-//mybatis.org//DTD Config 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-config.dtd'><configuration> <plugins> <plugin interceptor='com.qxy.mybatis.interceptor.MyInterceptor'/> </plugins></configuration>

application.yml特別重要的一點,一定將mybatis-config中的對象注入到Sprint容器中,否則不會生效。

...//省略其他配置mybatis: config-location: classpath:/mybatis-config.xml

ReflectUtil

...//省略其他配置mybatis: config-location: classpath:/mybatis-config.xml

debug

mybatis 自定義實現攔截器插件Interceptor示例

上圖中能夠看到BoundSql對象中主要存儲的屬性值,所以我們自定義攔截器時,主要針對BoundSql的屬性值進行修改。程序代碼沒有走到我們反射機制設置值的位置,測試createTime=null;

mybatis 自定義實現攔截器插件Interceptor示例

返回之前,看下BoundSql對象的值,創建時間已被賦值。

mybatis 自定義實現攔截器插件Interceptor示例

源代碼:https://github.com/stream-source

到此這篇關于mybatis 自定義實現攔截器插件Interceptor的文章就介紹到這了,更多相關mybatis 自定義實現攔截器插件Interceptor內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 西安中国国际旅行社(西安国旅) | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 企业微信scrm管理系统_客户关系管理平台_私域流量运营工具_CRM、ERP、OA软件-腾辉网络 | 气象监测系统_气象传感器_微型气象仪_气象环境监测仪-山东风途物联网 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 亮点云建站-网站建设制作平台 | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 食品质构分析仪-氧化诱导分析仪-瞬态法导热系数仪|热冰百科 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 凝胶成像系统(wb成像系统)百科-上海嘉鹏 | 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 |