MyBatis 源碼解析筆記


作者筆記倉庫https://github.com/seazean/javanotes

歡迎各位關注我的筆記倉庫,clone 倉庫到本地后使用 Typora 閱讀效果更好。

筆記內容參考視頻:https://www.bilibili.com/video/BV1mW411M737?p=71


一、運行機制

MyBatis 運行過程:

  1. 加載 MyBatis 全局配置文件,通過 XPath 方式解析 XML 配置文件,首先解析核心配置文件, 標簽中配置屬性項有 defaultExecutorType,用來配置指定 Executor 類型,將配置文件的信息填充到 Configuration對象。最后解析映射器配置的映射文件,並 構建 MappedStatement 對象填充至 Configuration,將解析后的映射器添加到 mapperRegistry 中,用於獲取代理

  2. 創建一個 DefaultSqlSession 對象,根據參數創建指定類型的 Executor,二級緩存默認開啟,把 Executor 包裝成緩存執行器

  3. DefaulSqlSession 調用 getMapper(),通過 JDK 動態代理獲取 Mapper 接口的代理對象 MapperProxy

  4. 執行 SQL 語句:

    • MapperProxy.invoke() 執行代理方法,通過 MapperMethod 判斷執行的是增刪改查中的哪個方法
    • 獲取執行者對象 MappedStatement,Executor 調用 executor 開始驅動方法的執行
    • 首先通過 CachingExecutor 去二級緩存查詢,查詢不到去一級緩存查詢,最后去數據庫查詢並放入一級緩存
  • Configuration 對象根據 標簽的 statementType 屬性,根據屬性選擇創建哪種對象
  • 判斷 BoundSql 是否被創建,沒有創建會重新封裝參數信息到 BoundSql
  • StatementHandler 的構造方法中,創建了 ParameterHandler 和 ResultSetHandler 對象
  • interceptorChain.pluginAll(statementHandler):攔截器鏈
  • prepareStatement():通過 StatementHandler 創建 JDBC 原生的 Statement 對象
    • getConnection():獲取 JDBC 的 Connection 對象
    • handler.prepare():初始化 Statement 對象
      • instantiateStatement(Connection connection):Connection 中的方法實例化對象
        • 獲取普通執行者對象:Connection.createStatement()
        • 獲取預編譯執行者對象:Connection.prepareStatement()
    • handler.parameterize():進行參數的設置
      • ParameterHandler.setParameters()通過 ParameterHandler 設置參數
        • typeHandler.setParameter():底層通過 TypeHandler 實現
  • StatementHandler.query()封裝成 JDBC 的 PreparedStatement 執行 SQL
  • resultSetHandler.handleResultSets(ps)通過 ResultSetHandler 對象封裝結果集
  • localCache.putObject(key, list):放入本地緩存
  • return list.get(0):返回結果集的第一個數據


    免責聲明!

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



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