MyBatis的執(zhí)行流程詳解
課工場 | 2021-09-15 13:17:53  1410 瀏覽

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

(圖片來源網(wǎng)絡(luò),侵權(quán)刪除)

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

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

攝圖網(wǎng)_500600484_wx_程序員編程(企業(yè)商用).jpg

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

攝圖網(wǎng)_500444067_wx_科技程序(企業(yè)商用).jpg

核心流程介紹

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

JDBC執(zhí)行六部走

  1. 注冊驅(qū)動

  2. 獲取Connection連接

  3. 執(zhí)行預編譯

  4. 執(zhí)行SQL

  5. 封裝結(jié)果集

  6. 釋放資源

以上就是JDBC操作數(shù)據(jù)的流程步驟,然后我看下MyBatis的執(zhí)行流程圖。


MyBatis執(zhí)行八步走

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

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

  2. 加載映射文件。映射文件即SQL映射文件,該文件中配置了操作數(shù)據(jù)庫的SQL語句,映射文件是在mybatis-config.xml中加載;可以加載多個映射文件

  • 常見的配置的方式有兩種,一種是package掃描包,一種是mapper找到配置文件的位置

  • <!-- 使用包路徑,掃描包下所有的接口,這種方式比較方便 --> <package name="com.mybatis.demo"/> <!-- resource:使用相對路徑的資源引用--> <!-- url:使用絕對類路徑的資源引用--> <!-- class:使用映射器接口實現(xiàn)類的完全限定類名--> <mapper resource="xxx.xml"/>

  1. 構(gòu)造會話工廠獲取SqlSessionFactory。這個過程其實是用建造者設(shè)計模式使用SqlSessionFactoryBuilder對象構(gòu)建的,SqlSessionFactory的最佳作用域是應用作用域。

// 2. 創(chuàng)建SqlSessionFactory對象實際創(chuàng)建的是DefaultSqlSessionFactory對象
SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);
  1. 創(chuàng)建會話對象SqlSession。由會話工廠創(chuàng)建SqlSession對象,對象中包含了執(zhí)行SQL語句的所有方法,每個線程都應該有它自己的 SqlSession 實例。SqlSession的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。

  • // 3. 創(chuàng)建SqlSession對象實際創(chuàng)建的是DefaultSqlSession對象 SqlSession sqlSession = builder.openSession();

  1. Executor執(zhí)行器。是MyBatis的核心,負責SQL語句的生成和查詢緩存的維護,它將根據(jù)SqlSession傳遞的參數(shù)動態(tài)地生成需要執(zhí)行的SQL語句,同時負責查詢緩存的維護

  • SimpleExecutor -- SIMPLE 就是普通的執(zhí)行器。

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

  • BatchExecutor --它是批處理執(zhí)行器

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

  • <!--一個動態(tài)sql標簽就是一個`MappedStatement`對象--> <select id="selectUserList" resultType="com.mybatis.User"> select * from t_user </select>

  1. 輸入?yún)?shù)映射。輸入?yún)?shù)類型可以是基本數(shù)據(jù)類型,也可以是Map、List、POJO類型復雜數(shù)據(jù)類型,這個過程類似于JDBC的預編譯處理參數(shù)的過程,有兩個屬性 parameterType和parameterMap

  2. 封裝結(jié)果集。可以封裝成多種類型可以是基本數(shù)據(jù)類型,也可以是Map、List、POJO類型復雜數(shù)據(jù)類型。封裝結(jié)果集的過程就和JDBC封裝結(jié)果集是一樣的

  • 也有兩個常用的屬性resultType和resultMap。

我們再來看一下這個完整的執(zhí)行步驟

代碼如下:

/**
* Mybatis測試*/public class MybatisTest {public static void main(String[] args) throws Exception {// 1.加載配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 2. 創(chuàng)建SqlSessionFactory對象實際創(chuàng)建的是DefaultSqlSessionFactory對象SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);// 3. 創(chuàng)建SqlSession對象實際創(chuàng)建的是DefaultSqlSession對象SqlSession sqlSession = builder.openSession();// 4. 創(chuàng)建代理對象UserMapper mapper = sqlSession.getMapper(UserMapper.class);// 5. 執(zhí)行查詢語句List<User> users = mapper.selectUserList();// 6. 釋放資源sqlSession.close();inputStream.close();}}

通過分析Mybatis的執(zhí)行流程,我們可以發(fā)現(xiàn)它和JDBC基本大同小異,比較明顯的地方就是

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

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

至于其他的部分,如執(zhí)行sql預編譯、執(zhí)行查詢、封裝結(jié)果集等都是抽取到了其他的類中來完成這些操作。

通過對JDBC執(zhí)行步驟來對比分析MyBatis的執(zhí)行的流程,總體上來看它們的執(zhí)行步驟基本是一樣的,所以大家是不是覺得MyBatis這個框架其實也挺簡單的,總結(jié)下其實就是

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

  • 處理參數(shù)

  • 執(zhí)行查詢

  • 封裝結(jié)果集



標簽:
欧美性大战XXXXX久久久√,国产无遮挡裸体免费视频网站 ,久99久女女精品免费观看69堂,五月综合激情婷婷六月,国自产精品手机在线观看视频,欧美色爱综合网,国产精品三级国产AV,免费黄色高清无码,**a免费视频毛片,亚洲AV永久无码精品无码四虎
婷婷丁香六月激情综合在线人| 亚洲人成网站在线播放942| 久久99综合国产精品亚洲首页| 久天啪天天久久99久孕妇| a毛片基地免费全部香蕉| 国产成a人片在线观看视频下载| 色午夜一AV男人的天堂| 综合亚洲另类欧美久久成人精品| 激情爆乳一区二区三区| 日日摸日日踫夜夜爽无码| 国产裸体裸拍免费观看| 国产精品久久久久不卡绿巨人| 无码人妻一区二区精品视频| 五月天国产亚洲av麻豆| 久久久久久AV无码免费网站下载| 久久综合香蕉国产蜜臀AV| 亚洲一区二区三区乱码AⅤ| 特级婬片国产高清视频| 国产亚洲av手机在线观看| 少妇久久久久久人妻无码| 57pao一国产成视频永久免费| 国产午夜片无码区在线观看 | 国产精品爱啪在线播放| 亚洲AV无码一区二区乱孑伦AS| 国产三级国产经典国产AV| 国产在线精品一区二区高清不卡| 日本亚洲福利大尺度在线| 色综合天天综合网国产成人网 | 美女很黄很黄在线观看亚洲一区| 亚洲综合日韩AⅤ无码毛片| 国产爆乳美女娇喘呻吟| 免费人成在线视频无码| 伊人热热久久原色播放www| 亚洲av色吊丝无码| AV喷水高潮 喷水在线| 性色av无码专区一ⅴa亚洲| 国产一区二区三区无码| 亚洲 欧美 偷自乱 图片| 国产乱理伦片a级在线观看 | 亚洲成A人片在线观看无码| 日韩亚洲AV无码一区二区不卡|