开发 Mybatis 插件

Mybatis 插件

Mybatis 插件介绍

Mybatis 借助于四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)对持久层的进行操作。支持用插件对四大核心对象进行拦截,增强核心对象的功能。
增强功能本质上是借助于底层的动态代理实现的,所以 MyBatis 中的四大对象都是代理对象。
在这里插入图片描述
MyBatis 所允许拦截的方法如下:

  • 执行器 Executor(update、query、commit、rollback等方法)
  • SQL语法构建器 StatementHandler(prepare、parameterize、batch、updates query 等方法)
  • 参数处理器 ParameterHandler(getParameterObject、setParameters方法)
  • 结果集处理器 ResultSetHandler(handleResultSets、handleOutputParameters等方法)

Mybatis 插件原理

在四大对象创建的时候

  1. 每个创建出来的对象不是直接返回的,而是通过 interceptorChain.pluginAll(parameterHandler) 方法的代理对象。
  2. pluginAll 会调用所有的 Interceptor 的 plugin 方法,返回被重重代理后的对象。
    在这里插入图片描述
    四大组件都会调用 interceptorChain.pluginAll 生成代理对象
    在这里插入图片描述

时序图

在这里插入图片描述

自定义插件

@Intercepts({ //大花括号,可以定义多个@Signature对多个地方拦截
        @Signature(type = StatementHandler.class, //这是指拦截哪个接口
                method = "prepare", //这个接口内的哪个方法名
                args = {Connection.class, Integer.class} // 这是拦截的方法的入参,按顺序写到这,如果方法重载通过方法名和入参来确定方法
        )
})
public class MyPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //增强逻辑
        System.out.println("对方法进行了增强....");
        return invocation.proceed(); //执行原方法
    }

    @Override
    public Object plugin(Object target) {
        System.out.println("将要包装的目标对象: " + target);
        return Interceptor.super.plugin(target);
    }

    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的初始化参数: " + properties);
        Interceptor.super.setProperties(properties);
    }

}

mybatis 配置文件中

<plugins>
    <plugin interceptor="com.li.plugin.MyPlugin">
        <!--配置参数-->
        <property name="name" value="狗蛋"/>
    </plugin>
</plugins>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值