Mybatis 中如何優雅的增強日誌功能?

無敵天驕發表於2021-03-29

首先搞清楚那些地方需要列印日誌?透過對日誌的觀察,如下幾個位置需要打日誌:

  • 在建立  prepareStatement 時,列印執行的 SQL 語句;

  • 訪問資料庫時,列印引數的型別和值

  • 查詢出結構後,列印結果資料條數

因 此 在 日 志 模 塊 中 有  BaseJdbcLogger 、  ConnectionLogger 、  PreparedStatementLogger 和  ResultSetLogge 透過動態代理負責在不同的位置列印日誌;幾個相關類的類圖如下:


Mybatis 中如何優雅的增強日誌功能?


BaseJdbcLogger:所有日誌增強的抽象基類,用於記錄 JDBC 那些方法需要增強,儲存執行期間 sql 引數資訊;

ConnectionLogger:負責列印連線資訊和 SQL 語句。透過動態代理,對  connection 進行增強,如果是呼叫  prepareStatementprepareCallcreateStatement 的方法,列印要執行的 sql 語句並返回  prepareStatement 的代理物件( PreparedStatementLogger),讓 prepareStatement 也具備日誌能力,列印引數;

PreparedStatementLogger:對  prepareStatement 物件增強,增強的點如下:

  • 增強  PreparedStatement 的 setxxx 方法將引數設定到  columnMapcolumnNamescolumnValues,為列印引數做好準備;
  • 增強  PreparedStatement 的 execute 相關方法,當方法執行時,透過動態代理列印引數,返回動態代理能力的 resultSet;
  • 如果是查詢,增強  PreparedStatement 的  getResultSet 方法,返回動態代理能力的 resultSet;如果是更新,直接列印影響的行數

ResultSetLogge:負責列印資料結果資訊;

最後一個問題:上面講這麼多,都是日誌功能的實現,那 日誌功能是怎麼加入主體功能的

答:既然在  Mybatis 中  Executor 才是訪問資料庫的元件,日誌功能是在  Executor 中被嵌入的,具體程式碼在
org.apache.ibatis.executor.SimpleExecutor.prepareStatement(StatementHandler, Log)方法中,如下圖所示:

Mybatis 中如何優雅的增強日誌功能?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2765518/,如需轉載,請註明出處,否則將追究法律責任。

相關文章