ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(六)mybatis拦截器

2019-08-16 15:03:01  阅读:200  来源: 互联网

标签:拦截器 proceed Object mybatis 拦截 方法 class


首先拦截器可以拦截mybatis四大核心对象:
StatementHandler,ParameterHandler,ResultSetHandler,Executor,具体拦截时根据需求拦截一部分方法

写拦截器分为三步:

1.定义拦截器实现拦截器接口,说明拦截什么

@Intercepts({
        //说明拦截什么
        @Signature(type= StatementHandler.class, method = "query",args = {Statement.class, ResultHandler.class})
})

2.编写拦截器方法

public class MyInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object proceed = invocation.proceed();  //放行方法,拿到返回值
        System.out.println("拦截方法"+proceed);
        return proceed;
    }

    @Override
    //将拦截器之中定义增强功能和原来的核心功能合并,
    public Object plugin(Object target) {
        Object wrap = Plugin.wrap(target, this);  //合并
        System.out.println(wrap);
        return wrap;
    }
    @Override
    public void setProperties(Properties properties) {
        System.out.println("拿到的属性:"+properties);
    }
}

3.进行配置

   <plugins>
        <plugin interceptor="Interceptors.MyInterceptor">
            <property name="name" value="张三"/>
            <property name="loves" value="作画"/>
        </plugin>
    </plugins>

这样,当你运行指定方法时,他就会进行拦截,拦截分为两部分,一部分是setProperties和plugin方法,在发送请求的时候拦截,获取到值之后,返回的路上,用intercept拦截。

另外如果有多个拦截器,按照配置的顺序进行拦截。

下面是一个简单的拦截器实现:拦截查询时设置参数的方法,将参数改变为2:
注解:

//自定义拦截器
@Intercepts({
        //说明拦截什么
//        @Signature(type= StatementHandler.class, method = "query",args = {Statement.class, ResultHandler.class})
        @Signature(type= StatementHandler.class, method = "parameterize",args = {Statement.class})
})

拦截方法:

public Object intercept(Invocation invocation) throws Throwable {

        Object target= invocation.getTarget();  //目标方法,具体执行的方法
        System.out.println("目标对象"+target);
        //将目标方法包装,获取之后的产物
        MetaObject metaObject = SystemMetaObject.forObject(target); //内置方法

        //拦截,将方法的参数变为2
        metaObject.setValue("parameterHandler.parameterObject",2);

        //获取参数值,验证
        Object object = metaObject.getValue("parameterHandler.parameterObject");
        System.out.println("拿到的参数值:"+object);

        Object proceed = invocation.proceed();  //放行,执行查询方法,拿到返回值
        return proceed;
    }

这里需要注意:

1.proceed()是放行方法,放行之后就会执行查询操作,所以拦截操作要在这个方法之前进行,注意拦截时机。

2.mybatis底层用parameterize设置参数,query只是查询

 

标签:拦截器,proceed,Object,mybatis,拦截,方法,class
来源: https://www.cnblogs.com/eenio/p/11363899.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有