作者筆記倉庫:https://github.com/seazean/javanotes
歡迎各位關注我的筆記倉庫,clone 倉庫到本地后使用 Typora 閱讀效果更好。
筆記內容參考視頻:https://www.bilibili.com/video/BV1mW411M737?p=71
一、運行機制
MyBatis 運行過程:
-
加載 MyBatis 全局配置文件,通過 XPath 方式解析 XML 配置文件,首先解析核心配置文件,
標簽中配置屬性項有 defaultExecutorType,用來配置指定 Executor 類型,將配置文件的信息填充到 Configuration對象。最后解析映射器配置的映射文件,並
構建 MappedStatement 對象填充至 Configuration,將解析后的映射器添加到 mapperRegistry 中,用於獲取代理
-
創建一個 DefaultSqlSession 對象,根據參數創建指定類型的 Executor,二級緩存默認開啟,把 Executor 包裝成緩存執行器
-
DefaulSqlSession 調用 getMapper(),通過 JDK 動態代理獲取 Mapper 接口的代理對象 MapperProxy
-
執行 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):返回結果集的第一個數據
