深入JavaWeb技術世界15:深入淺出Mybatis基本原理

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫裏查看

https://github.com/h2pl/Java-Tutorial

喜歡的話麻煩點下Star哈

文章首發於我的個人博客:

www.how2playlife.com

本×××術江湖】的《走進JavaWeb技術世界》其中一篇,本文部分內容來源於網絡,爲了把本文主題講得清晰透徹,也整合了很多我認爲不錯的技術博客內容,引用其中了一些比較好的博客文章,如有侵權,請聯繫作者。

該系列博文會告訴你如何從入門到進階,從servlet到框架,從ssm再到SpringBoot,一步步地學習JavaWeb基礎知識,並上手進行實戰,接着瞭解JavaWeb項目中經常要使用的技術和組件,包括日誌組件、Maven、Junit,等等內容,以便讓你更完整地瞭解整個JavaWeb技術體系,形成自己的知識框架。爲了更好地總結和檢驗你的學習成果,本系列文章也會提供每個知識點對應的面試題以及參考答案。

如果對本系列文章有什麼建議,或者是有什麼疑問的話,也×××術江湖】聯繫作者,歡迎你參與本系列博文的創作和修訂。

文末贈送8000G的Java架構師學習資料,需要的朋友可以到文末了解領取方式,資料包括Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送作者原創的Java學習指南、Java程序員面試指南等乾貨資源)
<!-- more -->

引言

在mybatis的基礎知識中我們已經可以對mybatis的工作方式窺斑見豹(參考:《MyBatis————基礎知識》)。

但是,爲什麼還要要學習mybatis的工作原理?因爲,隨着mybatis框架的不斷髮展,如今已經越來越趨於自動化,從代碼生成,到基本使用,我們甚至不需要動手寫一句SQL就可以完成一個簡單應用的全部CRUD操作。

從原生mybatis到mybatis-spring,到mybatis-plus再到mybatis-plus-spring-boot-starter。spring在發展,mybatis同樣在隨之發展。

萬變的外表終將迷惑人們的雙眼,只要抓住核心我們永遠不會迷茫!

工作原理原型圖

用最直觀的圖,來征服你的心!

image

工作原理解析

mybatis應用程序通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中構建出SqlSessionFactory(SqlSessionFactory是線程安全的);

然後,SqlSessionFactory的實例直接開啓一個SqlSession,再通過SqlSession實例獲得Mapper對象並運行Mapper映射的SQL語句,完成對數據庫的CRUD和事務提交,之後關閉SqlSession。

說明:SqlSession是單線程對象,因爲它是非線程安全的,是持久化操作的獨享對象,類似jdbc中的Connection,底層就封裝了jdbc連接。

詳細流程如下:

1、加載mybatis全局配置文件(數據源、mapper映射文件等),解析配置文件,MyBatis基於XML配置文件生成Configuration,和一個個MappedStatement(包括了參數映射配置、動態SQL語句、結果映射配置),其對應着<select | update | delete | insert>標籤項。

2、SqlSessionFactoryBuilder通過Configuration對象生成SqlSessionFactory,用來開啓SqlSession。

3、SqlSession對象完成和數據庫的交互:
a、用戶程序調用mybatis接口層api(即Mapper接口中的方法)
b、SqlSession通過調用api的Statement ID找到對應的MappedStatement對象
c、通過Executor(負責動態SQL的生成和查詢緩存的維護)將MappedStatement對象進行解析,sql參數轉化、動態sql拼接,生成jdbc Statement對象
d、JDBC執行sql。

e、藉助MappedStatement中的結果映射關係,將返回結果轉化成HashMap、JavaBean等存儲結構並返回。

mybatis層次圖:

image

MyBatis框架及原理分析

MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架,其主要就完成2件事情:

  1. 封裝JDBC操作
  2. 利用反射打通Java類與SQL語句之間的相互轉換

MyBatis的主要設計目的就是讓我們對執行SQL語句時對輸入輸出的數據管理更加方便,所以方便地寫出SQL和方便地獲取SQL的執行結果纔是MyBatis的核心競爭力。

MyBatis的配置

MyBatis框架和其他絕大部分框架一樣,需要一個配置文件,其配置文件大致如下:

<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="false"/>
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/> &lt;!&ndash; 打印日誌信息 &ndash;&gt;-->
    </settings>

    <typeAliases>
        <typeAlias type="com.luo.dao.UserDao" alias="User"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/> <!--事務管理類型-->
            <dataSource type="POOLED">
                <property name="username" value="luoxn28"/>
                <property name="password" value="123456"/>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.1.150/ssh_study"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="userMapper.xml"/>
    </mappers>
</configuration>

以上配置中,最重要的是數據庫參數的配置,比如用戶名密碼等,如果配置了數據表對應的mapper文件,則需要將其加入到<mappers>節點下。 

MyBatis的主要成員

  • Configuration        MyBatis所有的配置信息都保存在Configuration對象之中,配置文件中的大部分配置都會存儲到該類中
  • SqlSession            作爲MyBatis工作的主要頂層API,表示和數據庫交互時的會話,完成必要數據庫增刪改查功能
  • Executor               MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
  • StatementHandler 封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設置參數等
  • ParameterHandler  負責對用戶傳遞的參數轉換成JDBC Statement 所對應的數據類型
  • ResultSetHandler   負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合
  • TypeHandler          負責java數據類型和jdbc數據類型(也可以說是數據表列類型)之間的映射和轉換
  • MappedStatement  MappedStatement維護一條<select|update|delete|insert>節點的封裝
  • SqlSource              負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回
  • BoundSql              表示動態生成的SQL語句以及相應的參數信息

以上主要成員在一次數據庫操作中基本都會涉及,在SQL操作中重點需×××參數什麼時候被設置和結果集怎麼轉換爲JavaBean對象的,這兩個過程正好對應StatementHandler和ResultSetHandler類中的處理邏輯。

深入JavaWeb技術世界15:深入淺出Mybatis基本原理

<sub>(圖片來自《深入理解mybatis原理》 MyBatis的架構設計以及實例分析)</sub>

參考文章

https://www.jianshu.com/p/e398435fc1c4
https://segmentfault.com/a/1190000015117926?utm_source=tag-newest#articleHeader4
https://blog.csdn.net/u014745069/article/details/80788127
https://blog.csdn.net/u014297148/article/details/78696096
https://blog.csdn.net/weixin_43184769/article/details/91126687

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