Mybatis插件编写

1、首先复习MyBatis原理
2、插件原理
  • 每个创建出来的对象不是直接返回的,而是intercepterChain.pluginAll(parameterHandler)包装过的
  • 获取到所有的Intercepter(拦截器)(插件需要实现的接口),调用interceptor.plugin(target),返回target包装后的对象
  • 插件机制,我们可以使用插件为目标对象创建一个代理对象:AOP,我们的插件可以为四大对象创建出代理对象,代理对象可以拦截到四大对象的每一个执行
3、自定义插件
  • 编写Interceptor的实现类
  • 使用@Intercepts注解完成插件签名
  • 将写好的插件注册到全局配置文件中
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

/**
 * @Author :ps
 * @Date :2021/7/11 10:34
 * @Description :
 */
// 完成插件签名,告诉mybatis当前插件拦截哪个对象的哪个方法
@Intercepts({@Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)})
public class MyFirstPlugin implements Interceptor {

    // 拦截目标对象的目标方法的执行
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("intercept>>>>>>>>>>>>>" + invocation.getMethod());
        // 编写一个插件,改变查询的参数
        Object target = invocation.getTarget();
        // 拿到原来的参数
        MetaObject metaObject = SystemMetaObject.forObject(target);
        Object value = metaObject.getValue("parameterHandler.parameterObject");
        System.out.println("sql的参数是:" + value);
        // 修改参数
        metaObject.setValue("parameterHandler.parameterObject",11);
        Object proceed = invocation.proceed();
        // 返回执行后的返回值
        return proceed;
    }

    // 包装目标对象,为目标对象创建一个代理对象
    @Override
    public Object plugin(Object o) {
        // 借助Plugin.wrap(o, this)来使用当前interceptor包装目标对象
        System.out.println("plugin>>>>>>>>>>>>>" + o);
        Object wrap = Plugin.wrap(o, this);
        // 返回当前target创建的代理对象
        return wrap;
    }

    // 将拦截器的插件注册时的properties属性设置过来
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件的配置信息:" + properties);
    }
}
<plugins>
		<plugin interceptor="com.atguigu.mybatis.dao.MyFirstPlugin">
			<property name="username" value="root"/>
			<property name="pwd" value="123456"/>
		</plugin>
	</plugins>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值