MyBatis的執行流程詳解

說到流程這個事兒,大家可能最先想到的就是富士康的流水線,標準化的分工讓每道工序都如絲一般潤滑,所以才成就了富士康"世界工廠"的名號。

想當年猿小二也是衆多流水線工人中的一員,每天成百上千次的重複着同一個動作;突然有一天猿小二頓悟了,他認爲我不能在這裏浪費青春,我要去改變世界,於是他決定學習Java,沒想到這可一發不可收拾,學起Java來,如久旱逢甘霖,如魚得水一樣的輕鬆順暢。

但是好景不長,最近他就在學習MyBatis這裏遇到了點小麻煩,總是搞不清楚,MyBatis是怎麼一個接口、一個映射文件(寫sql)就可以操作數據庫了呢?它的執行流程到底是怎麼樣的呢?帶着這樣的疑問,猿小二開始了他的探索....

說到MyBatis執行流程,估計80%的程序員可能每天都沉浸在一個接口方法、一條SQL快樂的coding中,也可能他們都在忙着陪女朋友(可能性不大,因爲程序員沒有女朋友),也可能是沒有時間研究;也可能覺得使用起來很簡單,不就是加載配置文件,執行SQL嗎,soeasy;但是作爲一個勵志成爲優秀工程師的程序猿,僅僅停留在這個層面還遠遠不夠,它根本滿足不了我們對技術的渴望。

核心流程介紹

我們都知道MyBtis是對JDBC的簡易封裝,它的出現某種程度了是爲了消除所有的JDBC代碼和參數的手工設置以及結果集的封裝問題;不管怎樣,JDBC的那一套還是不會變的,只是做了抽象、封裝、歸類等;所以想要理解MyBatis的執行流程,那就不得不先回顧一下JDBC的執行流程。

 

JDBC執行六步走

1、註冊驅動

2、獲取Connection連接

3、執行預編譯

4、執行SQL

5、封裝結果集

6、釋放資源

以上就是JDBC操作數據的流程步驟,然後我看下MyBatis的執行流程圖。

 

MyBatis執行八步走

上面流程就是MyBatis內部核心流程,咱們來一步步解釋下,根據圖中步驟,我們可以將這個執行流程分成了8個步驟。

1、讀取MyBatis的核心配置文件。mybatis-config.xml爲MyBatis的全局配置文件,用於配置數據庫連接、屬性、類型別名、類型處理器、插件、環境配置、映射器(mapper.xml)等信息,這個過程中有一個比較重要的部分就是映射文件其實是配在這裏的;這個核心配置文件最終會被封裝成一個Configuration對象

2、加載映射文件。映射文件即SQL映射文件,該文件中配置了操作數據庫的SQL語句,映射文件是在mybatis-config.xml中加載;可以加載多個映射文件。常見的配置的方式有兩種,一種是package掃描包,一種是mapper找到配置文件的位置。

<!-- 使用包路徑,掃描包下所有的接口,這種方式比較方便 --> 

<package name="com.mybatis.demo"/> 

<!-- resource:使用相對路徑的資源引用-->

<!-- url:使用絕對類路徑的資源引用-->

<!-- class:使用映射器接口實現類的完全限定類名-->

<mapper resource="xxx.xml"/>

 

3、構造會話工廠獲取SqlSessionFactory。這個過程其實是用建造者設計模式使用SqlSessionFactoryBuilder對象構建的,SqlSessionFactory的最佳作用域是應用作用域。

//2. 創建SqlSessionFactory對象實際創建的是DefaultSqlSessionFactory對象

SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);

 

4、創建會話對象SqlSession。由會話工廠創建SqlSession對象,對象中包含了執行SQL語句的所有方法,每個線程都應該有它自己的 SqlSession 實例。SqlSession的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。

//3. 創建SqlSession對象實際創建的是DefaultSqlSession對象

  SqlSession sqlSession = builder.openSession();

 

5、Executor執行器。是MyBatis的核心,負責SQL語句的生成和查詢緩存的維護,它將根據SqlSession傳遞的參數動態地生成需要執行的SQL語句,同時負責查詢緩存的維護

SimpleExecutor -- SIMPLE 就是普通的執行器。

ReuseExecutor-執行器會重用預處理語句(PreparedStatements)

BatchExecutor --它是批處理執行器

 

6、MappedStatement對象。MappedStatement是對解析的SQL的語句封裝,一個MappedStatement代表了一個sql語句標籤,如下:

<!--一個動態sql標籤就是一個`MappedStatement`對象-->

<select id="selectUserList" resultType="com.mybatis.User">  

  select * from t_user

</select>

 

7、輸入參數映射。輸入參數類型可以是基本數據類型,也可以是Map、List、POJO類型複雜數據類型,這個過程類似於JDBC的預編譯處理參數的過程,有兩個屬性 parameterType和parameterMap

8、封裝結果集。可以封裝成多種類型可以是基本數據類型,也可以是Map、List、POJO類型複雜數據類型。封裝結果集的過程就和JDBC封裝結果集是一樣的。也有兩個常用的屬性resultType和resultMap。

我們再來看一下這個完整的執行步驟,代碼如下:

/**

* Mybatis測試

*/

public class MybatisTest {

public static void main(String[]args) throws Exception {

 // 1.加載配置文件

 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

 //2. 創建SqlSessionFactory對象實際創建的是DefaultSqlSessionFactory對象

SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);

 //3. 創建SqlSession對象實際創建的是DefaultSqlSession對象

  SqlSession sqlSession = builder.openSession();

 //4. 創建代理對象

  UserMapper mapper = sqlSession.getMapper(UserMapper.class);

 //5. 執行查詢語句

 List<User> users = mapper.selectUserList();

 //6. 釋放資源

  sqlSession.close();

  inputStream.close();

}

}

 

通過分析Mybatis的執行流程,我們可以發現它和JDBC基本大同小異,比較明顯的地方就是:

1、註冊驅動獲取鏈接的部分都抽取到了核心配置文件mybatis-config.xml中。

2、sql語句抽取到了映射文件mapper.xml中。

至於其他的部分,如執行sql預編譯、執行查詢、封裝結果集等都是抽取到了其他的類中來完成這些操作。通過對JDBC執行步驟來對比分析MyBatis的執行的流程,總體上來看它們的執行步驟基本是一樣的,所以大家是不是覺得MyBatis這個框架其實也挺簡單的,總結下其實就是:

加載解析配置文件(核心配置文件和映射文件)

處理參數

執行查詢

封裝結果集

 

喜歡我們的文章嗎?還想了解互聯網哪些技術,歡迎留言告訴我們

【AI課工場】互聯網知識也能如此好玩~

更多熱門互聯網技術文章搶先知微信公衆號【kgc-cn】

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章