■ 閱讀原始碼mybatis運算元據庫的過程:
/* 測試查詢 */
@Test
public void testGet() throws IOException {
// 1、從classpath路徑載入mybatis全域性配置檔案mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2、建立SqlSessoinFactory會話工廠物件,好比連線池DataSource
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3、建立SqlSession會話物件,好比連線物件Connection
SqlSession session = factory.openSession();
// 4、獲取mapper物件
UserMapper mapper = session.getMapper(UserMapper.class);
//執行sql操作
User user = mapper.get(1L);
System.out.println(user);
// 5、關閉資源
session.close();
}
(1)建立SqlSessoinFactory會話工廠物件
- 檢視原始碼得知,表名上是建立了一個SqlSessoinFactory會話工廠物件, 實際上在建立SqlSessoinFactory會話工廠物件的時候還建立了一個全域性配置物件。【我們還順帶看了一下全域性配置的建立過程啦】
(2)建立SqlSessoin會話物件
-
檢視原始碼得知,表名上是建立了一個SqlSessoin會話物件, 實際上在建立SqlSessoin會話物件的時候還建立了一個全執行器物件。【我們還順帶看了一下執行器的建立過程啦】
-
執行器物件Executor【
CachingExcutor(Simple)帶有快取的執行器
】,是mybatis的排程中心,負責sql的生成和查詢快取維護。在建立SqlSessoin會話物件建立,會執行pluginAll方法
(3)建立mapper物件
- 檢視原始碼得知,建立mapper物件, 實際上通過jdk的代理機制建立了一個mapper的代理物件。
(4) 執行sql操作:mapper.get(1L);
- 先判斷傳入的方法型別,不是Object型別,就使用對映方法進行執行
- 執行的時候會根據元素型別進行選擇
- 我們執行mapper.get(1L)實際上是會話物件呼叫selectOne方法
- selectOne 返回一個集合list,觀察selectList
- 對映語句mapperStatement封裝了元素的資訊
- 在selectList方法看到執行器呼叫查詢方法
- 發現執行查詢的過程,先經過CachingExcutor(帶有二級快取的執行器),先從二級快取中尋找是否有資料
- 發現執行查詢的過程,經過BaseExcutor(底層的執行器),先從一級快取localCache中尋找是否有資料,若是沒有在從資料庫中查詢
- 從資料庫查詢,是簡單的執行器,呼叫doQuery方法
- 構建語句處理器物件
- 構建RoutingStatementHandler語句處理器物件
- 構建PreparedStatementHandler預編譯語句處理器物件
- 構建ParameterHandler引數處理器物件、構建ParameterHandler引數處理器物件
- ★ Statement(PreparedStatement 預編譯語句物件)建立物件之前,先建立引數處理器和結果處理器
□ ParamterHandler 引數處理器,先把使用者傳入的引數轉成JDBC需要的引數值,在建立物件之前,會執行pluginAll方法
□ ResultSetHandler 結果集處理器,把結果集中的資料封裝到list集合,在建立物件之前,會執行pluginAll方法
- 例項化一個語句物件
。。。
✿ 總結閱讀mybatis執行sql的原始碼中的核心物件:
-
InterceptorChaiin 攔截器鏈,多個攔截器合成
-
Configuration 全域性配置物件,封裝了所有的配置資訊
-
Executor 執行器,myBatis的排程中心,負責sql生成和查詢快取維護,在建立sqlSession物件之前。建立 ok之後,會執行pluginAll方法
-
- BaseExecutor 底層的執行器,先從一級快取中查詢,若沒有,則到資料庫中查詢
-
- CachingExcutor(Simple) 帶有二級快取的執行器,先去二級快取中尋找是否有資料
-
MappedStatement 對映語句物件,封裝了一個元素節點(insert|delete|update|select)的資訊
-
StatementHandler 語句處理器,封裝了JDBC的DML/DQL操作,引數設定,在建立物件時,執行pluginAll方法
-
- RoutingStatement
-
TypeHandler 型別轉化器,把java型別和JDBC型別做相互轉化操作,引數處理器、結果集處理器都會用到它。
■ 在建立StatementHandler 建立物件之前,先建立引數處理器和結果集處理器
□ ParameterHandler 引數處理器,把使用者傳入的引數轉化為JDBC需要的引數值,在建立物件時,執行 pluginAll方法
□ ResultSetrHandler 結果集處理器,在結果集中的資料封裝到List集合,在建立物件時,執行 pluginAll方法