【mybatis源碼學習】mybatis的插件功能

1、mybatis的插件功能可攔截的目標

org.apache.ibatis.executor.parameter.ParameterHandler
org.apache.ibatis.executor.resultset.ResultSetHandler
org.apache.ibatis.executor.statement.StatementHandler
org.apache.ibatis.executor.Executor

2、Mybatis的插件功能接入步驟

一、實現接口:org.apache.ibatis.plugin.Interceptorsql

二、實現類上須要添加註解@Intercepts和@Signature 用於描述要進行攔截的類接口和方法數據庫

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Intercepts {
  Signature[] value(); //要攔截的方法信息描述
}

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Signature {
  Class<?> type(); //要攔截的類的描述(接口)

  String method();//要攔截的方法名

  Class<?>[] args();//要攔截的方法名的參數列表的類型
}
View Code

三、將實現的Interceptor的類的對象,注入到Configuration的interceptorChain中apache

3、編寫一個打印當前執行sql語句的插件案例

一、分析

依據mybatis的執行計劃,StatementHandler 有一個方法 BoundSql getBoundSql(),其調用時機是向數據庫申請鏈接,並向sql語句綁定參數時,從其內部獲取sql語句。mybatis

 

故插件須要對StatementHandler進行攔截,並在其執行 getBoundSql語句時,從返回結果中獲取sql語句,並打印框架

二、注意點

mybatis的插件功能使用的前提是對mybatis框架很是熟悉。ide

三、案例

@Intercepts(value = {@Signature(type = StatementHandler.class,method = "prepare",args = {Connection.class,Integer.class})})
public class SqlPrintInterceptor implements Interceptor {

    /**
     * 決定那個對象須要進行代理攔截
     * @param target
     * @return
     */
    @Override
    public Object plugin(Object target) {
        if(target instanceof StatementHandler){
            return Plugin.wrap(target, this);
        }
        return target;
    }

    /**
     * 執行代理的邏輯加強
     * @param invocation
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
         Object obj=invocation.proceed();
         RoutingStatementHandler handler= (RoutingStatementHandler) invocation.getTarget();
         System.out.println("current do sql=["+handler.getBoundSql().getSql()+"]");
        return obj;
    }

    /**
     * 設置當前代理的配置
     * @param properties
     */
    @Override
    public void setProperties(Properties properties) {

    }
}
View Code

 

interceptorChain
相關文章
相關標籤/搜索