<label id="oakn9"><ruby id="oakn9"><input id="oakn9"></input></ruby></label>

<button id="oakn9"><acronym id="oakn9"><input id="oakn9"></input></acronym></button>

備注:本文修訂于2022年11月12日。

前言

MyBatis的底層操作封裝了JDBC的API,MyBatis的工作原理以及核心流程與JDBC的使用步驟一脈相承,MyBatis的核心對象(SqlSession,Executor)與JDBC的核心對象(Connection,Statement)相互對應。站長給廣大初學者提供的學習建議是:從JDBC入手并立足于JDBC,才能深入的理解MyBatis的工作原理以及核心流程。關于JDBC的詳細介紹,可以參考本文文末。

1、如何掌握MyBatis的工作原理?

關于MyBatis的工作原理,網上的文章是汗牛充棟,但是站長覺得,要結合JDBC來理解MyBatis的工作原理往往才能更透徹。我們知道,JDBC有四個核心對象:
(1)DriverManager,用于注冊數據庫連接
(2)Connection,與數據庫連接對象
(3)Statement/PrepareStatement,操作數據庫SQL語句的對象
(4)ResultSet,結果集或一張虛擬表

而MyBatis也有四大核心對象:
(1)SqlSession對象,該對象中包含了執行SQL語句的所有方法【1】。類似于JDBC里面的Connection 【2】。
(2)Executor接口,它將根據SqlSession傳遞的參數動態地生成需要執行的SQL語句,同時負責查詢緩存的維護。類似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement對象,該對象是對映射SQL的封裝,用于存儲要映射的SQL語句的id、參數等信息。
(4)ResultHandler對象,用于對返回的結果進行處理,最終得到自己想要的數據格式或類型??梢宰远x返回類型。

備注【1】和備注【2】的說明如下:

在JDBC中,Connection不直接執行SQL方法,而是利用Statement或者PrepareStatement來執行方法。在使用JDBC建立了連接之后,可以使用Connection接口的createStatement()方法來獲取Statement對象,也可以調用prepareStatement()方法獲得PrepareStatement對象,通過executeUpdate()方法來執行SQL語句。而在MyBatis中,SqlSession對象包含了執行SQL語句的所有方法,但是它是委托Executor執行的。從某種意義上來看,MyBatis里面的SqlSession類似于JDBC中的Connection,他們都是委托給其他類去執行。

最后說一點,雖然SqlSession對象包含了執行SQL語句的所有方法,但是它同樣包括了:

<T> T getMapper(Class<T> type);

所以SqlSession也可以委托給映射器來執行數據的增刪改查操作。如下代碼所示:

// 獲得mapper接口的代理對象
PersonMapper pm = session.getMapper(PersonMapper.class);
// 直接調用接口的方法,查詢id為1的Peson數據
Person p2 = pm.selectPersonById(1);

這上面來看,SqlSession是不是也類似于JDBC中的Connection呢?

2、MyBatis的工作原理以及核心流程詳解

MyBatis的工作原理如下圖所示:

上面中流程就是MyBatis內部核心流程,每一步流程的詳細說明如下文所述:

(1)讀取MyBatis的配置文件。mybatis-config.xml為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對結果集的解析過程。

3、擴展閱讀

通過上文的內容,大家已經了了解了MyBatis的工作原理以及核心流程,可以擴展一下知識面,了解一下MyBatis的前世JDBC數據庫編程的相關知識,以及MyBatis常見面試題中關于底層原理的考題。

1、MyBatis的前世:JDBC數據庫編程

2、MyBatis常見面試題:說說mybatis的工作原理

標簽: none

[站長推薦]-[系統化學習]


已有 3 條評論

  1. 會飛的魚 會飛的魚

    不錯

  2. coderlyz coderlyz

    感謝感謝

  3. 不錯

添加新評論

久久99国产只有精品