源碼揭秘mybatis日志實現的原理


 背景

       在程序開發過程中,為了調試方便、了解程序的運行過程,進行必要的日志輸出總是免不了的。對於使用Mybatis而言,我們常見的需求是希望可以在日志中打印出Mybatis執行過程中進行數據庫操作的SQL語句及其傳遞的參數。Mybatis的日志輸出是統一管理的,它有自己的日志接口,然后在需要進行日志輸出的時候使用統一的API進行日志輸出。這個統一的接口是org.apache.ibatis.logging.Log。Mybatis分別基於常用的日志輸出工具給出了對應的實現,比如LOG4J、SLF4J等。默認情況下Mybatis的org.apache.ibatis.logging.LogFactory會按照以下順序依次判斷當前程序下可以使用哪種日志實現,直到找到為止,如果一個實現都沒有那就是最后的noLogging了,將采用NoLoggingImpl實現。

Mybatis內置的日志工廠提供日志功能,具體的日志實現有以下幾種工具:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging
  • NoLogging

日志簡介

mybatis日志定義了一個日志門面LogFactory,在需要使用時調用getLog方法:

private static final Log log = LogFactory.getLog(xxxx.class);
      if (log.isDebugEnabled()) {
        log.debug("。。。。。。。。。。。。。");
      }

從上面可以看到LogFactory決定了使用哪個日志體系

  static {
    tryImplementation(LogFactory::useSlf4jLogging);
    tryImplementation(LogFactory::useCommonsLogging);
    tryImplementation(LogFactory::useLog4J2Logging);
    tryImplementation(LogFactory::useLog4JLogging);
    tryImplementation(LogFactory::useJdkLogging);
    tryImplementation(LogFactory::useNoLogging);
  }

具體使用哪個,可以在Settings中配置

初始化日志實現

深入源碼

廢話不多,直接上流程圖

 

 

 

從流程圖上看:

1.構建SqlSessionFactory時,加載配置文件。

2.調用XMLConfigBuilder的parse方法,解析配置文件

 

 

 3.加載實例,配置到Configuration類中

 

 

 4.調用LogFactory,並設置實例

 

 

 5.將實例賦值給Log

 

 

 總結

除了上面提到的幾個日志實現類,還有打印sql的日志。

Mybatis的日志輸出可以輸出數據庫連接的獲取、釋放信息;

可以輸出執行的SQL語句及其傳遞的預編譯參數信息;

可以輸出查詢結果集信息(需要是trace輸出級別,其它的是DEBUG級別);

Mybatis的日志輸出實現是通過JDK的動態代理來實現的,針對Connection的日志輸出提供了ConnectionLogger;

針對Statement提供了StatementLogger;針對PreparedStatement提供了PreparedStatementLogger;

針對ResultSet提供了ResultSetLogger,這些Logger類都是實現了JDK的InvocationHandler類的。

 注意:如果你的應用部署在一個包含Commons Logging的環境, 而你又想用其他的日志框架,你可以根據需要調用如下的某一方法:

org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
org.apache.ibatis.logging.LogFactory.useStdOutLogging();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM