Spring boot 集成 Mybatis plugins(自定義插件)

MyBatis 允許你在映射語(yǔ)句執(zhí)行過(guò)程中的某一點(diǎn)進(jìn)行攔截調(diào)用。默認(rèn)情況下,MyBatis 允許使用插件來(lái)攔截的方法調(diào)用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed):從寫(xiě)SQL
  • ParameterHandler (getParameterObject, setParameters):處理參數(shù)
  • ResultSetHandler (handleResultSets, handleOutputParameters):處理結(jié)果集
  • StatementHandler (prepare, parameterize, batch, update, query):參數(shù)、結(jié)果集、sql都可處理

編寫(xiě)插件的步驟

  1. 實(shí)現(xiàn)Interceptor接口。
  2. 使用@Intercepts注解完成插件簽名。
  3. 在全局配置文件中注冊(cè)插件。

插件示例

/**
 * 攔截所有更新語(yǔ)句
 */
//注解的意思是:攔截Executor類(lèi)的update(MappedStatement,Object)方法
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class EditPlugin implements Interceptor {

    /**
     * 攔截目標(biāo)對(duì)象的目標(biāo)方法的執(zhí)行
     *
     * @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);
        //執(zhí)行目標(biāo)方法
        return invocation.proceed();
    }

    /**
     * 包裝目標(biāo)對(duì)象:為目標(biāo)對(duì)象創(chuàng)建一個(gè)代理對(duì)象
     *
     * @param target
     * @return
     */
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    /**
     * 將插件注冊(cè)時(shí)的properties屬性設(shè)置進(jìn)來(lái)
     *
     * @param properties
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的信息 = " + properties);
    }
}

注冊(cè)插件

MXL方式

<plugins>
    <plugin interceptor="com.xiaolyuh.mybatis.EditPlugin">
        <property name="args1" value="參數(shù)示例"/>
    </plugin>
</plugins>

Spring Boot 方式

注冊(cè)插件方式1

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

注冊(cè)插件方式2

@Configuration
public class MybatisConfig {
//    // 注冊(cè)插件方式2
//    @Bean
//    public ConfigurationCustomizer configurationCustomizer() {
//        return new ConfigurationCustomizer() {
//            @Override
//            public void customize(org.apache.ibatis.session.Configuration configuration) {
//                //插件攔截鏈采用了責(zé)任鏈模式,執(zhí)行順序和加入連接鏈的順序有關(guān)
//                EditPlugin myPlugin = new EditPlugin();
//                configuration.addInterceptor(myPlugin);
//            }
//        };
//    }

    // 注冊(cè)插件方式2
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            //插件攔截鏈采用了責(zé)任鏈模式,執(zhí)行順序和加入連接鏈的順序有關(guān)
            EditPlugin myPlugin = new EditPlugin();
            configuration.addInterceptor(myPlugin);
        };
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容