閱讀mybatis的原始碼的思路

一樂樂發表於2022-02-15

■ 閱讀原始碼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會話工廠物件的時候還建立了一個全域性配置物件。我們還順帶看了一下全域性配置的建立過程啦
    image

(2)建立SqlSessoin會話物件

  • 檢視原始碼得知,表名上是建立了一個SqlSessoin會話物件, 實際上在建立SqlSessoin會話物件的時候還建立了一個全執行器物件。我們還順帶看了一下執行器的建立過程啦

  • 執行器物件ExecutorCachingExcutor(Simple)帶有快取的執行器】,是mybatis的排程中心,負責sql的生成和查詢快取維護。在建立SqlSessoin會話物件建立,會執行pluginAll方法
    image

(3)建立mapper物件

  • 檢視原始碼得知,建立mapper物件, 實際上通過jdk的代理機制建立了一個mapper的代理物件。
    image
    image

(4) 執行sql操作:mapper.get(1L);

  • 先判斷傳入的方法型別,不是Object型別,就使用對映方法進行執行
    image
  • 執行的時候會根據元素型別進行選擇
    image
  • 我們執行mapper.get(1L)實際上是會話物件呼叫selectOne方法
    image
  • selectOne 返回一個集合list,觀察selectList
    image
  • 對映語句mapperStatement封裝了元素的資訊
    image
  • 在selectList方法看到執行器呼叫查詢方法
    image
  • 發現執行查詢的過程,先經過CachingExcutor(帶有二級快取的執行器),先從二級快取中尋找是否有資料
    image
  • 發現執行查詢的過程,經過BaseExcutor(底層的執行器),先從一級快取localCache中尋找是否有資料,若是沒有在從資料庫中查詢
    image
  • 從資料庫查詢,是簡單的執行器,呼叫doQuery方法
    image
  • 構建語句處理器物件
    image
  • 構建RoutingStatementHandler語句處理器物件
    image
  • 構建PreparedStatementHandler預編譯語句處理器物件
    image
  • 構建ParameterHandler引數處理器物件、構建ParameterHandler引數處理器物件
    image


  • ★ Statement(PreparedStatement 預編譯語句物件)建立物件之前,先建立引數處理器和結果處理器
    □ ParamterHandler 引數處理器,先把使用者傳入的引數轉成JDBC需要的引數值,在建立物件之前,會執行pluginAll方法
    □ ResultSetHandler 結果集處理器,把結果集中的資料封裝到list集合,在建立物件之前,會執行pluginAll方法
    image
    image
    image

  • 例項化一個語句物件
    image
    。。。



✿ 總結閱讀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方法



相關文章