Mybatis Plugin * 开发过程详解
作者:---WeiGeH 发布时间:2021-07-15 22:30:18
这篇文章主要介绍了Mybatis Plugin * 开发过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1.Plugin
MyBatis 允许使用插件来拦截的方法调用包括:
• Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
• ParameterHandler (getParameterObject, setParameters)
• ResultSetHandler (handleResultSets, handleOutputParameters)
• StatementHandler (prepare, parameterize, batch, update, query)
注意;可以通过插件拦截到这四个对象,修改参数等操作:
你必须要知道的类:
org.apache.ibatis.plugin.Plugin
org.apache.ibatis.reflection.SystemMetaObject
2.使用步骤
实现 Interceptor 接口
三个方法执行顺序
setProperties()
plugin()
intercept()
FirstIntercepter=====>setProperties
FirstIntercepter====>pluginorg.apache.ibatis.executor.CachingExecutor@64485a47
FirstIntercepter====>pluginorg.apache.ibatis.scripting.defaults.DefaultParameterHandler@2f0a87b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.resultset.DefaultResultSetHandler@4fcd19b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.statement.RoutingStatementHandler@2fd66ad3
DEBUG 09-05 11:56:24,696 ==> Preparing: select * from employee where id=? (BaseJdbcLogger.java:159)
FirstIntercepter:===>intercept
DEBUG 09-05 11:56:24,722 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:159)
DEBUG 09-05 11:56:24,739 <== Total: 1 (BaseJdbcLogger.java:159)
Employee [id=1, lastName=tom, gender=1, email=asd@qq.com, depid=null]
给你的 * 签名:
/**
* 完成插件签名:
* 告诉MyBatis当前插件用来拦截哪个对象的哪个方法
* type:要拦截的四大类型
* method:拦截那个方法
* args:这个方法的入参
* */
@Intercepts({
@Signature(type=StatementHandler.class,
method="parameterize",
args=java.sql.Statement.class
)
})
public class FirstIntercepter implements Interceptor
mybatis-cfg.xml中配置插件
这里注意配置plugins的标签顺序,以免出错,在environments上面
<!-- plugins 插件的配置 实际上是使用:intercepter原理代理的 -->
<plugins>
<plugin interceptor="mybatis.intercepter.FirstIntercepter">
<property name="param1" value="root"/>
<property name="param2" value="root"/>
</plugin>
</plugins>
3.多个插件的执行
多个插件依次生成目标对象的代理对象,层层包裹,先声明的先包裹;形成代理链
可以理解为:初始化执行
执行log
FirstIntercepter=====>setProperties
MySecondIntercepter====>setProperties:{param1=root}
FirstIntercepter====>pluginorg.apache.ibatis.executor.CachingExecutor@64485a47
MySecondIntercepter====>plugin:org.apache.ibatis.executor.CachingExecutor@64485a47
FirstIntercepter====>pluginorg.apache.ibatis.scripting.defaults.DefaultParameterHandler@2f0a87b3
MySecondIntercepter====>plugin:org.apache.ibatis.scripting.defaults.DefaultParameterHandler@2f0a87b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.resultset.DefaultResultSetHandler@4fcd19b3
MySecondIntercepter====>plugin:org.apache.ibatis.executor.resultset.DefaultResultSetHandler@4fcd19b3
FirstIntercepter====>pluginorg.apache.ibatis.executor.statement.RoutingStatementHandler@2fd66ad3
MySecondIntercepter====>plugin:org.apache.ibatis.executor.statement.RoutingStatementHandler@2fd66ad3
DEBUG 09-05 12:07:01,928 ==> Preparing: select * from employee where id=? (BaseJdbcLogger.java:159)
MySecondIntercepter====>intercept:public abstract void org.apache.ibatis.executor.statement.StatementHandler.parameterize(java.sql.Statement) throws java.sql.SQLException
FirstIntercepter:===>intercept
DEBUG 09-05 12:07:01,954 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:159)
DEBUG 09-05 12:07:01,968 <== Total: 1 (BaseJdbcLogger.java:159)
Employee [id=1, lastName=tom, gender=1, email=asd@qq.com, depid=null]
4.实现拦截修改参数
sql
<!-- Employee getSelectEmp(Integer id); -->
<select id="getSelectEmp" parameterType="java.lang.Integer"
resultType="mybatis.bean.Employee">
select * from employee where id=#{id}
</select>
这里我们拦截id:
由于ibatis中参数的声明存在与 StatementHandler中所以注意签名
@Intercepts({
@Signature(type=StatementHandler.class,
method="parameterize",
args=java.sql.Statement.class
)
})
业务逻辑intercept方法中
/**
* 1:业务逻辑处理的方法:
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
//在这里可以进行业务逻辑修改
System.out.println("FirstIntercepter:===>intercept"+invocation.getMethod());
MetaObject metaObject = SystemMetaObject.forObject(invocation.getTarget());
//拿到target的元数据 StatementHandler==>ParameterHandler===>
//DefaultParameterHandler==>>parameterObject
Object value = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("sql "+value.toString());
//修改完sql语句要用的参数
metaObject.setValue("parameterHandler.parameterObject", 2);
Object object = invocation.proceed();
return object;
}
打印log,
可以看到原来入参为1,现在经过 * 修改入参为2
DEBUG 09-05 12:36:23,387 ==> Preparing: select * from employee where id=? (BaseJdbcLogger.java:159)
MySecondIntercepter====>intercept:public abstract void org.apache.ibatis.executor.statement.StatementHandler.parameterize(java.sql.Statement) throws java.sql.SQLException
FirstIntercepter:===>interceptpublic abstract void org.apache.ibatis.executor.statement.StatementHandler.parameterize(java.sql.Statement) throws java.sql.SQLException
sql 1
DEBUG 09-05 12:36:23,418 ==> Parameters: 2(Integer) (BaseJdbcLogger.java:159)
DEBUG 09-05 12:36:23,432 <== Total: 1 (BaseJdbcLogger.java:159)
Employee [id=2, lastName=cat, gender=0, email=qwe@qq.com, depid=null]
来源:https://www.cnblogs.com/dgwblog/p/9591499.html
猜你喜欢
- 本文实例讲述了C#自定义繁体和简体字库实现中文繁体和简体之间转换的方法。分享给大家供大家参考。具体分析如下:这里使用C#自定义繁体和简体字库
- 1、包装类型是什么?Java 为每一个基本数据类型都引入了对应的包装类型,int 的包装类就是 Integer,从 Java 5 开始引入了
- 一、java端首先我使用的是java自带的对webservice的支持包来编写的服务端和发布程序,代码如下。webservice的接口代码:
- 一、串口连接的打开与关闭串口,即COM口,在.NET中使用 SerialPort 类进行操作。串口开启与关闭,是涉及慢速硬件的IO操作,频繁
- 如下所示:public class Test{public static void main(String[] args) {
- 使用FastJson解决long类型在js中失去精度问题1.pom中需要将默认的jackson排除掉<dependency>&n
- package com.cooly;import java.util.LinkedList;/*** @author coolyqq*模拟打
- 本文实例为大家分享了java实现二分法查找出数组重复数字的具体代码,供大家参考,具体内容如下package offer;/** * 二分查找
- 1|1简介最近基于最新的Activiti7配置了SpringBoot2。简单上手使用了一番。发现市面上解决Activiti7的教程很少,采坑
- 这篇文章主要介绍了spring boot 2整合swagger-ui过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。程序分析:请抓住分子与分母的变化规
- JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步
- 前言 图片加水印:Springboot 图片需要添加水印,怎么办? 1秒就实现那么word文档替换文字、插入图片,当然也是1秒钟了
- 配置Servlet的方法有俩种,分别是传统web.xml文档中部署servlet和注解方式部署servlet,下面就先一起来学习 * 解方式部
- WPF的ImageBrush是一个比较常见也比较复杂的笔刷,它继承自图块笔刷(TileBrush)。使用图块画笔绘制区域涉及以下三个组成部分
- 获取e.printStackTrace()打印的信息某些情况下,我们需要获取应用打印的异常信息,这时就可以借助StringWriter和Pr
- 大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我先说几句不相干的话。不知不觉我发现自己接触Android已有近
- 异步、多线程、任务、并行编程之一:选择合适的多线程模型本篇概述:@FCL4.0中已经存在的线程模型,以及它们之间异同点;@多线程编程模型的选
- C#实现MD5加密,具体如下:方法一首先,先简单介绍一下MD5MD5的全称是message-digest algorithm 5(信息-摘要
- java 计算同比增长工具类为了数据的严谨性,统一装换为BigDecimal,话不多说,看代码。package com.pig4cloud.