背景
在程序開發過程中,為了調試方便、了解程序的運行過程,進行必要的日志輸出總是免不了的。對於使用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();