MyBatis的執行流程詳解

2020-08-28 課工場

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

想當年猿小二也是眾多流水線工人中的一員,每天成百上千次的重複著同一個動作;突然有一天猿小二頓悟了,他認為我不能在這裡浪費青春,我要去改變世界,於是他決定學習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=&34;/> <!-- resource:使用相對路徑的資源引用--> <!-- url:使用絕對類路徑的資源引用--> <!-- class:使用映射器接口實現類的完全限定類名--> <mapper resource=&34;/>

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

// 2. 創建SqlSessionFactory對象實際創建的是DefaultSqlSessionFactory對象 SqlSessionFactory builder = new SqlSessionFactoryBuilder().build(inputStream);

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

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

  1. Executor執行器。是MyBatis的核心,負責SQL語句的生成和查詢緩存的維護,它將根據SqlSession傳遞的參數動態地生成需要執行的SQL語句,同時負責查詢緩存的維護
  • SimpleExecutor -- SIMPLE 就是普通的執行器。
  • ReuseExecutor -執行器會重用預處理語句(PreparedStatements)
  • BatchExecutor --它是批處理執行器
  1. MappedStatement對象。MappedStatement是對解析的SQL的語句封裝,一個MappedStatement代表了一個sql語句標籤,如下:

<!--一個動態sql標籤就是一個`MappedStatement`對象--> <select id=&34; resultType=&34;> select * from t_user </select>

  1. 輸入參數映射。輸入參數類型可以是基本數據類型,也可以是Map、List、POJO類型複雜數據類型,這個過程類似於JDBC的預編譯處理參數的過程,有兩個屬性 parameterType和parameterMap
  2. 封裝結果集。可以封裝成多種類型可以是基本數據類型,也可以是Map、List、POJO類型複雜數據類型。封裝結果集的過程就和JDBC封裝結果集是一樣的。也有兩個常用的屬性resultType和resultMap。

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

/** * Mybatis測試 */ public class MybatisTest { public static void main(String[] args) throws Exception { // 1.加載配置文件 InputStream inputStream = Resources.getResourceAsStream(&34;); // 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這個框架其實也挺簡單的,總結下其實就是:

  • 加載解析配置文件(核心配置文件和映射文件)
  • 處理參數
  • 執行查詢
  • 封裝結果集

相關焦點

  • MyBatis的執行流程詳解,值得收藏
    它的執行流程到底是怎麼樣的呢?帶著這樣的疑問,猿小二開始了他的探索....的執行流程,那就不得不先回顧一下JDBC的執行流程。,根據圖中步驟,我們可以將這個執行流程分成了8個步驟。釋放資源 sqlSession.close(); inputStream.close(); } }通過分析Mybatis的執行流程,我們可以發現它和JDBC基本大同小異,比較明顯的地方就是:註冊驅動獲取連結的部分都抽取到了核心配置文件mybatis-config.xml中。
  • 圖解MyBatis的SQL執行流程(乾貨)
    上面我們講到了,獲取到的Mapper接口實際上被包裝成為了代理對象,所以我們執行查詢語句肯定是執行的代理對象方法,接下來我們就以Mapper接口的代理對象MapperProxy來分析一下查詢流程。整個sql執行流程可以分為兩大步驟:一、尋找sql二、執行sql語句尋找sql首先還是來看一下尋找
  • Mybatis的SqlSession執行sql過程
    上一篇分析了SqlSession的創建過程,接下來就來到最後一步執行sql的過程了。執行sql總覽首先還是來看下目前分析的代碼所處的位置,具體的代碼如下:之前也說過要使用mybatis操作資料庫,在代碼裡面與mybatis相關的代碼只需要三步:創建SqlSessionFactory對象,利用SqlSessionFactory對象創建SqlSession,最後利用SqlSession執行sql。
  • Mybatis工作流程及其原理
    3.SqlSession (會話): 一個既可以發送 SQL 執行返回結果,也可以獲取Mapper的接口。4.SQL Mapper (映射器): 它由一個Java接口和XML文件(或註解)構成,需要給出對應的SQL和映射規則,它負責發送SQL去執行,並返回結果。
  • MyBatis的SQL執行流程不清楚?看完這一篇就夠了
    前言MyBatis可能很多人都一直在用,但是MyBatis的SQL執行流程可能並不是所有人都清楚了,那麼既然進來了,通讀本文你將收穫如下:1、Mapper接口和映射文件是如何進行綁定的2、MyBatis中SQL語句的執行流程3、自定義MyBatis中的參數設置處理器typeHandler4、自定義MyBatis中結果集處理器typeHandler
  • Mybatis中SqlSource解析流程詳解
    在通過註解實現mapper的流程中是在MapperAnnotationBuilder類的parseStatement方法中對SqlSource進行初始化,初始化代碼如下圖:通過xml文件實現mapper的流程中是在XMLStatementBuilder類的parseStatementNode方法中對SqlSource進行初始化
  • mybatis的Configuration詳解
    上一篇介紹了mybatis中SqlSessionFactory的創建過程,今天來學習它默認實現中的唯一屬性Configuration。利用mybatis查出數據只用三步:創建SqlSessionFactory、通過SqlSessionFactory創建SqlSession、SqlSession執行selectOne方法。
  • 從零開始手寫 mybatis(四)- mybatis 事務管理機制詳解
    前景回顧第一節 從零開始手寫 mybatis(一)MVP 版本 中我們實現了一個最基本的可以運行的 mybatis。第二節 從零開始手寫 mybatis(二)mybatis interceptor 插件機制詳解第三節 從零開始手寫 mybatis(三)jdbc pool 從零實現資料庫連接池本節我們一起來學習一下 mybatis 中的事務管理。
  • Mybatis緩存詳解
    mybatis是一個查詢資料庫的封裝框架,主要是封裝提供靈活的增刪改sql,開發中,service層能夠通過mybatis組件查詢和修改資料庫中表的數據;作為查詢工具,mybatis有使用緩存,這裡講一下mybatis的緩存相關源碼。
  • 肇東法院:強制執行流程詳解
    肇東法院:強制執行流程詳解 2020-11-03 17:03 來源:澎湃新聞·澎湃號·政務
  • 詳解mybatis和Mybatis-Plus區別
    Mybatis-Plus(以下簡稱MP)是為簡化開發、提高開發效率而生,但它也提供了一些很有意思的插件,比如SQL性能監控、樂觀鎖、執行分析等。-- mybatis mybatis-plus mybatis-spring mvc --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>${mybatis-plus.version
  • Spring MyBatis初始化解析+sql執行流程
    MybatisConfigurationpublic <T> T getMapper(Class<T> type, SqlSession sqlSession) { return this.mybatisMapperRegistry.getMapper
  • Mybatis的SqlSession創建過程詳解
    前面mybatis的初始化過程分析完成,接下來是第二步SqlSession的創建。 創建過程總覽 SqlSession創建過程如下圖:
  • SpringBoot整合MyBatis+詳細列印執行SQL語句
    圖片來源網路為啥寫這篇文章呢,有人可能會說springBoot的mybatis的starter都有了寫這篇文章不是多此一舉嗎其實我一開始也是使用mybatis的starter的,但是當我需要配置一個讓mybatis可以將執行sql語句列印出來的配置時,難到了我,所以才想和大家分享一下springBoot整合MyBatis的方法,如果大家有更好地方法,歡迎討論。
  • mybatis核心組件及其流程
    select * from t_role where role_id=#{id} </if></select>RowBoundsmybatis實現分頁組件public class RowBounds { public static final int NO_ROW_OFFSET = 0; public static final int NO_ROW_LIMIT = Integer.MAX_VALUE;} 流程
  • Mybatis中類型映射處理器詳解
    資料庫廠商標識接上一篇文章分析,下一個解析的是databaseIdProvider節點,這個節點好理解,從字面理解就是資料庫提供商的id,也就是mybatis需要訪問的資料庫是那種資料庫。我們都知道mybatis只是一個ORM框架,並不是針對具體的資料庫,需要兼容多種資料庫,所以mybatis可以根據不同的資料庫廠商執行不同的語句,這種多廠商的支持是基於映射語句中的 databaseId 屬性。
  • mybatis的Configuration的屬性設置
    propertiesElement方法分析首先第一行執行的是propertiesElement(root.evalNode("properties"));可以看到是拿到mybatis配置文件中properties節點內容然後執行propertiesElement,我們看到propertiesElement
  • Mybatis中mapper的xml解析詳解
    基礎介紹回顧下之前是在分析configuration的初始化過程,已經進行到了最後一步mapperElement(root.evalNode("mappers")),這個方法裡有兩種解析mapper的方法,一種是解析類,一種是解析xml文件,上一篇文章在講解析類中的註解,今天說到的就是解析xml的流程
  • Mybatis中mapper相關註解解析類詳解
    接著上一篇通過掃描接口添加mapper的方法會創建MapperAnnotationBuilder並執行parse方法,具體源碼如下圖:MapperAnnotationBuilder關鍵屬性說明:statementAnnotationTypes:靜態屬性,存有各種sql對於在mybatis
  • mybatis——優秀的持久層框架
    1.mybatis的作用mybatis是一款優秀的持久層框架。傳統的JDBC(資料庫連接)主要完成建立與資料庫的連接、發送SQL語句和處理資料庫返回結果。但是在實現這些功能需要繁瑣的步驟和代碼,而mybatis很好解決了這些問題。