1、四大对象

  • Executor 执行具体jdbc操作
  • ParameterHandler 参数处理
  • ResultSetHandler 返回值解析处理
  • StatementHandler 执行者
  • 每个对象产生之前都会进行拦截器链的包装,产生对应的代理对象。

    2、编写插件

  • 具体使用参考官方文档 ```java package com.afei.mybatis.interception;

import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject;

import java.sql.Statement; import java.util.Properties;

/**

  • 自定义插件
  • 插件签名,告诉插件用来拦截哪个对象的哪个方法 parameterize 参数设置
  • @author shihengfei */ @Intercepts({

    1. @Signature(type = StatementHandler.class, method = "parameterize", args = Statement.class)

    }) public class MyOnePlugin implements Interceptor { /**

    • 拦截目标
    • @param invocation
    • @return
    • @throws Throwable */ @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println(“MyOnePlugin…intercept:”+invocation.getMethod()); // 拦截前 // 获取目标对象的元数据 Object target = invocation.getTarget(); MetaObject metaObject = SystemMetaObject.forObject(target); // 获取属性值 System.out.println(metaObject.getValue(“parameterHandler.parameterObject”)); // 修改属性值 // metaObject.setValue(“parameterHandler.parameterObject”,1); // 执行目标方法 Object proceed = invocation.proceed(); return proceed; }

      /**

    • 包装目标对象,创建一个代理对象
    • @param target
    • @return */ @Override public Object plugin(Object target) { System.out.println(“MyOnePlugin…plugin”+target); // 包装生成代理对象 Object wrap = Plugin.wrap(target, this); // 返回代理对象 return wrap; }

      @Override public void setProperties(Properties properties) { // 设置参数 System.out.println(“setProperties。。。”+properties); } }

  1. <a name="smxIZ"></a>
  2. ## 3、注册插件
  3. ```java
  4. package com.afei.mybatis.config;
  5. import com.afei.mybatis.interception.MyOnePlugin;
  6. import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. /**
  10. * mybatis 配置类
  11. * @author shihengfei
  12. */
  13. @Configuration
  14. public class MybatisConfig {
  15. @Bean
  16. public ConfigurationCustomizer configurationCustomizer() {
  17. // 添加插件-自动配置
  18. return configuration -> {
  19. configuration.addInterceptor(new MyOnePlugin());
  20. };
  21. }
  22. }