程序员

Spring boot 集成 Mybatis plugins(自

2019-11-27  本文已影响0人  xiaolyuh

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

编写插件的步骤

  1. 实现Interceptor接口。
  2. 使用@Intercepts注解完成插件签名。
  3. 在全局配置文件中注册插件。

插件示例

/**
 * 拦截所有更新语句
 */
//注解的意思是:拦截Executor类的update(MappedStatement,Object)方法
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class EditPlugin implements Interceptor {

    /**
     * 拦截目标对象的目标方法的执行
     *
     * @param invocation
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement statement = (MappedStatement) args[0];
        String sql = statement.getBoundSql(args[1]).getSql();
        System.out.println("--------intercept method: " + statement.getId() + "-----sql: " + sql);
        //执行目标方法
        return invocation.proceed();
    }

    /**
     * 包装目标对象:为目标对象创建一个代理对象
     *
     * @param target
     * @return
     */
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

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

注册插件

MXL方式

<plugins>
    <plugin interceptor="com.xiaolyuh.mybatis.EditPlugin">
        <property name="args1" value="参数示例"/>
    </plugin>
</plugins>

Spring Boot 方式

注册插件方式1

@Configuration
public class MybatisConfig {
    // 注册插件方式1
    @Bean
    public EditPlugin myPlugin() {
        return new EditPlugin();
    }
}

注册插件方式2

@Configuration
public class MybatisConfig {
//    // 注册插件方式2
//    @Bean
//    public ConfigurationCustomizer configurationCustomizer() {
//        return new ConfigurationCustomizer() {
//            @Override
//            public void customize(org.apache.ibatis.session.Configuration configuration) {
//                //插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关
//                EditPlugin myPlugin = new EditPlugin();
//                configuration.addInterceptor(myPlugin);
//            }
//        };
//    }

    // 注册插件方式2
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            //插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关
            EditPlugin myPlugin = new EditPlugin();
            configuration.addInterceptor(myPlugin);
        };
    }
}
上一篇下一篇

猜你喜欢

热点阅读