mybatis 自定义插件

mybatis 插件

Mybatis  所允许拦截的方法:

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

Mybatis 插件原理

  在四大对象创建的时候:

  • 每个创建出来的对象不是直接返回的,而是InterceptorChain.pluginAll(Object)
  • 获取到所有的 Interceptor(拦截器)(插件需要实现的接口),调用 Interceptor.plugin(target),,返回包装后的对象
  • 插件机制,我们可以使用插件为目标对象创建一个代理对象,AOP(面向切面)我们的插件可以为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行

实现自定义插件

 1 @Intercepts({
 2         // 方法签名
 3         @Signature(type = StatementHandler.class,//Executor.class, //那个类
 4                     method = "prepare",     //那个方法
 5                     // 方法参数
 6                     args = {Connection.class, Integer.class}),
 7         @Signature(type = Executor.class,
 8                     method = "query",
 9                     args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
10 
11 })
12 public class MyPlugin implements Interceptor {
13 
14     private final Logger logger = LoggerFactory.getLogger(MyPlugin.class);
15 
16     /**
17      * 插件的核心方法
18      * @param invocation
19      * @return
20      * @throws Throwable
21      */
22     @Override
23     public Object intercept(Invocation invocation) throws Throwable {
24         logger.info("-----------------对方法进行增强------------------");
25 
26         // 继续向下执行
27         return invocation.proceed();
28     }
29 
30     /**
31      * 生成 target 的代理对象
32      * @param o 将要包装的对象
33      * @return
34      */
35     @Override
36     public Object plugin(Object o) {
37         logger.info("-----将要包装的目标对象"+ o);
38         return Plugin.wrap(o, this);
39     }
40 
41     /**
42      * 传递插件所需参数
43      * @param properties
44      */
45     @Override
46     public void setProperties(Properties properties) {
47         logger.info("插件初始化参数:"+properties);
48     }
49 }

原生mybatis,需要在配置文件(sqlMapConfig.xml)中配置:

    <!-- 插件 -->
    <plugins>
        <!--自定义的插件-->
        <plugin interceptor="com.scdzyc.plugin.MyPlugin">
            <property name="name" value="myPlugin"/>
        </plugin>
    </plugins>

 

posted on 2020-07-26 20:43  未知不知  阅读(253)  评论(0)    收藏  举报