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

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

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

喜歡的話麻煩點下Star哈java

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

www.how2playlife.commysql

本文是微信公衆號【Java技術江湖】的《走進JavaWeb技術世界》其中一篇,本文部份內容來源於網絡,爲了把本文主題講得清晰透徹,也整合了不少我認爲不錯的技術博客內容,引用其中了一些比較好的博客文章,若有侵權,請聯繫做者。git

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

若是對本系列文章有什麼建議,或者是有什麼疑問的話,也能夠關注公衆號【Java技術江湖】聯繫做者,歡迎你參與本系列博文的創做和修訂。github

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

<!-- more -->spring

引言

在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鏈接。

詳細流程以下:

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

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

三、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操做中重點須要關注的是SQL參數何時被設置和結果集怎麼轉換爲JavaBean對象的,這兩個過程正好對應StatementHandler和ResultSetHandler類中的處理邏輯。

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

參考文章

https://www.jianshu.com/p/e398435fc1c4 https://segmentfault.com/a/1190000015117926?utm_source=tag-newest#articleHeader4 http://www.javashuo.com/article/p-nqvtutzj-hq.html http://www.javashuo.com/article/p-eawdggfh-bg.html http://www.javashuo.com/article/p-yhnqmtzv-hx.html

微信公衆號

我的公衆號:黃小斜

黃小斜是跨考軟件工程的 985 碩士,自學 Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術小白成長爲阿里工程師。

做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得和程序人生,目前黃小斜的CSDN博客有百萬+訪問量,知乎粉絲2W+,全網已有10W+讀者。

黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!

原創電子書: 關注微信公衆號【黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》這份電子書總結了我2年的Java學習之路,包括學習方法、技術總結、求職經驗和麪試技巧等內容,已經幫助不少的程序員拿到了心儀的offer!

程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取,包括Java、python、C++、大數據、機器學習、前端、移動端等方向的技術資料。

技術公衆號:Java技術江湖

若是你們想要實時關注我更新的文章以及分享的乾貨的話,能夠關注個人微信公衆號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站。做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!

(關注公衆號後回覆」Java「便可領取 Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源)

Java工程師必備學習資源: 一些Java工程師經常使用學習資源,關注公衆號後,後臺回覆關鍵字 「Java」 便可免費無套路獲取。

個人公衆號

相關文章
相關標籤/搜索