1.讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息,例如數據庫連接信息。
2.加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數據庫的 SQL 語句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數據庫中的一張表。
3.構造會話工廠:通過 MyBatis 的環境等配置信息構建會話工廠 SqlSessionFactory。
4.創建會話對象:由會話工廠創建 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。
5.Executor 執行器:MyBatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。
6.MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射信息的封裝,用于存儲要映射的 SQL 語句的 id、參數等信息。
7.輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本數據類型和 POJO 類型。輸入參數映射過程類似于 JDBC 對 preparedStatement 對象設置參數的過程。
8.輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。
1)Configuration:用于描述 MyBatis 主配置文件信息,MyBatis 框架在啟動時會加載主配置文件,將配置信息轉換為 Configuration 對象。
2)SqlSession:面向用戶的 API,是 MyBatis 與數據庫交互的接口。
3)Executor:SQL 執行器,用于和數據庫交互。SqlSession 可以理解為 Executor 組件的外觀(外觀模式),真正執行 SQL 的是 Executor 組件。
4)MappedStatement:用于描述 SQL 配置信息,MyBatis 框架啟動時,XML 文件或者注解配置的 SQL信息會被轉換為 MappedStatement 對象注冊到 Configuration 組件中。
5)StatementHandler:封裝了對 JDBC 中 Statement 對象的操作,包括為 Statement 參數占位符設置值,通過 Statement 對象執行 SQL語句。
6)TypeHandler:類型處理器,用于 Java 類型與 JDBC 類型之間的轉換。
7)ParameterHandler:用于處理 SQL 中的參數占位符,為參數占位符設置值。
8)ResultSetHandler:封裝了對 ResultSet 對象的處理邏輯,將結果集轉換為 Java 實體對象。
Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
1)SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。
2)ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置于Map<String, Statement>內,供下一次使用。簡言之,就是重復使用Statement對象。
3)BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內。
?級緩存使?者可以隨時使?或者銷毀緩存,從SqlSession對象打開時緩存就已經存在。當關閉SqlSession對象緩存就失效。當與spring整合的時候,直接跳過SqlSession對象,?法直接操作到SqlSession對象,spring在操作SqlSession的時候,不知道?戶什么時候關閉,所以每調?完?個dao?法就關閉了,所以導致?級緩存失效。
如果開啟了事務,?級緩存就會?效,因為開啟了事務,執?完dao就不會銷毀,因為?旦銷毀,事務就沒有了,你開啟了事務,Spring就知道你什么時候需要結束