mybatis插件开发

  1. 插件开发首先要实现Interceptor接口
public interface Interceptor {

  Object intercept(Invocation invocation) throws Throwable;

  Object plugin(Object target);

  void setProperties(Properties properties);

}

拦截器拦截mybatis的四大对象,四大对象:excetor,StatementHandler,ParamterHandler,ResultSetHandler。

  1. 实现Interceptor接口
  2. 重写接口的三个方法
  3. 在配置文件中配置拦截器
//签名:告诉拦截器拦截哪个对象的哪个方法
@Intercepts(value = {
        @Signature(
                args = java.sql.Statement.class, 
                method = "parameterize", 
                type = StatementHandler.class) 
        })
public class MyIntercepter implements Interceptor {

    /**
     * 拦截目标对象的目标方法的执行
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 执行目标方法
        Object target = invocation.proceed();// proceed();处理
        return target;// 执行后的返回值
    }

    @Override
    public Object plugin(Object target) {
        // Plugin包装目标对象--创建一个代理对象
        Object wrap = Plugin.wrap(target, this);
        return wrap;// 返回target创建的动态代理
    }

    /**
     * 将插件注册时的属性设置进来
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("配置信息" + properties);
    }
<plugin interceptor="com.nuc.zjy.blog.utils.MyIntercepter">
            <property name="username" value="zhao" />
        </plugin>

下面我们来实现一个简单的拦截器动态的修改sql的运行参数。

// 签名:告诉拦截器拦截哪个对象的哪个方法
@Intercepts(value = {
        @Signature(args = java.sql.Statement.class, method = "parameterize", type = StatementHandler.class) })
public class MyIntercepter implements Interceptor {

    /**
     * 拦截目标对象的目标方法的执行
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 动态的修改sql的参数,1.拿到StatementHandler==》的paramterHandler==》的paramtObject的值
        Object object = invocation.getTarget();
        MetaObject forObject = SystemMetaObject.forObject(object);// 拿到Target的元数据
        Object value = forObject.getValue("parameterHandler.parameterObject");// 获取属性值
        System.out.println("原先的值" + value);
        forObject.setValue("parameterHandler.parameterObject", 2);
        System.out.println("修改后的值" + value);
        // 执行目标方法
        Object target = invocation.proceed();// proceed();处理
        return target;// 执行后的返回值
    }

    @Override
    public Object plugin(Object target) {
        // Plugin包装目标对象--创建一个代理对象
        Object wrap = Plugin.wrap(target, this);
        return wrap;// 返回target创建的动态代理
    }

    /**
     * 将插件注册时的属性设置进来
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("配置信息" + properties);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值