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