美文网首页程序员
Spring boot 集成 Mybatis plugins(自

Spring boot 集成 Mybatis plugins(自

作者: xiaolyuh | 来源:发表于2019-11-27 13:03 被阅读0次

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

    • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed):从写SQL
    • ParameterHandler (getParameterObject, setParameters):处理参数
    • ResultSetHandler (handleResultSets, handleOutputParameters):处理结果集
    • StatementHandler (prepare, parameterize, batch, update, query):参数、结果集、sql都可处理

    编写插件的步骤

    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);
            };
        }
    }
    

    相关文章

      网友评论

        本文标题:Spring boot 集成 Mybatis plugins(自

        本文链接:https://www.haomeiwen.com/subject/fdlywctx.html