MyBatis源碼窺探:MyBatis整體架構(gòu)解析

Mybatis的使用這里就不介紹了,不知道怎么使用的朋友可以點擊

http://www.mybatis.org/mybatis-3/zh/index.html

這里面的教程很詳細,包括xml的配置、映射、動態(tài)sql都有介紹,可以學習和使用,本系列的文章將會更深入的了解MyBatis。

1. ORM簡介

ORM(Object Relational Mapping)對象-關(guān)系映射框架,ORM的主要功能就是根據(jù)映射配置文件,完成數(shù)據(jù)在對象模型與關(guān)系模型之間的映射。

1.1 常見的ORM框架

1.1.1 Hibernate

Hibernate通過hbm.xml映射文件維護一個Java類與數(shù)據(jù)庫表的映射關(guān)系,通過Hibernate的映射,Java開發(fā)人員可以用看待Java對象的角度去看待數(shù)據(jù)庫表中的數(shù)據(jù)行,數(shù)據(jù)庫中多有的表通過hbm.xml配置文件映射之后,都對應一個Java類。

1.1.2 JPA

JPA(Java Persistence API) 是EJB 3.0中持久化部分的規(guī)范,他可以脫離EJB的體系單獨作為一個持久化規(guī)范進行使用。

1.1.3 Spring JDBC

嚴格來說,Spring JDBC并不能算一個ORM框架,它僅僅是使用模板方式對原生JDBC進行了一層非常薄的封裝,使用Spring JDBC可以幫助開發(fā)人員屏蔽創(chuàng)建數(shù)據(jù)庫連接對象,Statement對象,異常處理以及事務管理的重復性代碼,提高開發(fā)效率。

1.1.4 MyBatis

MyBatis與前面介紹的持久化框架一樣,可以幫助開發(fā)人員屏蔽底層重復性的原生JDBC代碼,MyBatis通過映射配置文件或相應注解將ResultSet映射為Java對象,其映射規(guī)則可以嵌套其他映射規(guī)則以及子查詢,從而實現(xiàn)復雜的邏輯,也可實現(xiàn)一對一,一對多,多對多映射以及雙向映射。相比Hibemate更加輕量級,可控性也更高。

2. MyBatis整體架構(gòu)

MyBatis的整體分為三層,分別是基礎(chǔ)支持層,核心處理層和接口層,如圖所示

2.1 基礎(chǔ)支持層

基礎(chǔ)支持層包含整個MyBatis的基礎(chǔ)模塊,這些模塊為核心處理層的功能提供了良好的支撐,下面簡單描述下各個模塊。

2.1.1 數(shù)據(jù)源模塊

數(shù)據(jù)源是實際開發(fā)中常用的組件之一,現(xiàn)在開源的數(shù)據(jù)源都提供了比較豐富的功能,例如連接池功能、檢測鏈接狀態(tài)等,選擇性能優(yōu)秀的數(shù)據(jù)源組件對于提升ORM框架乃至整個應用的性能都是非常重要的。MyBatis自身提供了相應的數(shù)據(jù)源實現(xiàn)。當然MyBatis也提供了與第三方接口數(shù)據(jù)源集成的接口,這些功能都位于數(shù)據(jù)源模塊之中。

2.1.2 事務管理模塊

MyBatis對數(shù)據(jù)庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單的實現(xiàn),在很多場景中,MyBatis會與Spring框架集成,并由Spring框架管理事務相關(guān)配置。

2.1.3 緩存模塊

在優(yōu)化系統(tǒng)性能時,優(yōu)化數(shù)據(jù)庫性能是非常重要的一個環(huán)節(jié),而添加緩存則是優(yōu)化數(shù)據(jù)庫時最有效的手段之一。正確、合理的使用緩存可以將一部分數(shù)據(jù)庫請求攔截在緩存這一層,這就能夠減少相當一部分數(shù)據(jù)庫的壓力。

MyBatis中提供了一級緩存和二級緩存,而這兩級緩存都依賴于基礎(chǔ)支持層中的緩存模塊實現(xiàn),這里需要讀者注意的是MyBatis中自帶的兩級緩存以及整個應用是運行在一個JVM中的,共享一塊堆內(nèi)存,如果這兩級緩存中的數(shù)據(jù)量較大,則可能影響系統(tǒng)中其他功能的運行,所以當需要緩存大量數(shù)據(jù)時,優(yōu)先考慮使用Redis、Mongodb、Memcache等緩存產(chǎn)品。

2.1.4 Binding模塊

在調(diào)用 SqISession 相應方法執(zhí)行數(shù)據(jù)庫操作時,需要指定映射文件中定義的 SQL 節(jié)點,如果出現(xiàn)拼寫錯誤,我們只能在運行時才能發(fā)現(xiàn)相應的 異常 。 為了盡早發(fā)現(xiàn)這種錯誤, MyBatis 通過 Binding 模塊將用戶自定義的 Mapper 接 口與映射配置文件關(guān)聯(lián)起來,系統(tǒng)可以通過調(diào)用自定義 Mapper 接口中的方法執(zhí)行相應的 SQL 語句完成數(shù)據(jù)庫操作,從而避免上述問題。值得讀者注意的是,開發(fā)人員無須編寫自定義 Mapper接口的實現(xiàn), MyBatis會自動為 其創(chuàng)建動態(tài)代理對象。在有些場景中,自定義 Mapper接口可以完全代替映射配置文件, 但有的映射規(guī)則和 SQL 語句的定義還是寫在映射配置文件中比較方便,例如動態(tài) SQL 語句的定義 。

2.1.5 反射模塊

Java中的反射功能雖然強大,但對大多數(shù)開發(fā)人員來說,寫出高質(zhì)量的反射代碼還是有一定難度的。MyBatis中專門提供了反射模塊,該模塊對Java原生的反射進行了一系列優(yōu)化,例如緩存了類的元數(shù)據(jù),提高了反射的性能。

2.1.6 類型轉(zhuǎn)換模塊

MyBatis 為簡化配置文件提供了別名機制 , 該機制是類型轉(zhuǎn)換模 塊的主要功能之一 。 類型轉(zhuǎn)換模塊的另一個功能是實現(xiàn) JDBC 類型與 Java 類型之間的 轉(zhuǎn)換,該功能在為 SQL 語句綁定實參以及 映射查詢結(jié)果集 時都會涉及。在為 SQL 語 句綁定實參時, 會將數(shù)據(jù)由 Java類型轉(zhuǎn)換成 JDBC 類型;而在映射結(jié)果集時,會將數(shù) 據(jù)由 JDBC類型轉(zhuǎn)換成 Java類型。

2.1.7 日志模塊

無論在開發(fā)測試環(huán)境中,還是在線上生產(chǎn)環(huán)境中,日志在整個系統(tǒng)中的地位都是非常重要的。良好的日志功能可以幫助開發(fā)人員和測試人員快速定位 Bug代碼,也可以幫助運維人員快速定位性能瓶頸、等問題 。 目前的 Java 世界中存在很多優(yōu)秀的日志框架,例如 Log4j、 Log4j2, slf4j等。 MyBatis作為一個設計優(yōu)良的框架,除了提供詳細的日志輸出信息,還要能夠集成多種日志框架,其日志模塊的 一個主要功能就是集成第三方日志框架。

2.1.8 資源加載模塊

資源加載模塊主要是對類加載器進行封裝,確定類的使用順序,并提供了加載類文件以及其他資源文件的功能。

2.1.9 解析器模塊

解析器模塊主要提供了兩個功能:一個功能是對XPath進行封裝,為MyBatis初始化時解析mybatis-config.xml配置文件以及映射配置文件提供支持;另一個功能是為處理動態(tài)sql語句中的占位符提供支持。

2.2 核心處理層

在MyBatis的核心處理層中實現(xiàn)了MyBatis的核心處理流程,其中包括MyBatis的初始化以及完成一次數(shù)據(jù)庫操作的全部流程,而這些都是基于基礎(chǔ)支持層實現(xiàn)的。

2.2.1 配置解析

在 MyBatis 初始化過程中,會加載 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息會形成相應的對象并保存到 Configuration 對象中 。例如,節(jié)點(即ResultSet 的映射規(guī)則) 會被解析成 ResultMap 對象,定義的節(jié)點(即屬性映射)會被解析成 ResultMapping對象。之后,利用該 Configuration對象創(chuàng)SqlSessionFactor對象。待 MyBatis 初始化之后,開發(fā)人員可以通過初始化得到SqlSessionFactory創(chuàng)建 SqlSession 對象并完成數(shù)據(jù)庫操作。

2.2.2 參數(shù)映射-SQL解析

拼湊 SQL 語句是一件煩瑣且易出錯的過程,為了將開發(fā)人員從這項枯燥無趣的工作中解脫出來,MyBatis實現(xiàn)動態(tài)SQL語句的功能,提供了多種動態(tài) SQL語句對應的節(jié)點, 例如,節(jié)點、節(jié)點、節(jié)點等 。通過這些節(jié)點的組合使用,開發(fā)人員可以寫出幾乎滿足所有需求的動態(tài) SQL語句。 MyBatis 中的scripting模塊會根據(jù)用戶傳入的實參,解析映射文件中定義的動態(tài)SQL節(jié)點,并形成數(shù)據(jù)庫可執(zhí)行的SQL 語句 。之后會處理 SQL 語句中的占位符,綁定用戶傳入的實參。

2.2.3 SQL執(zhí)行

SQL語句的執(zhí)行涉及多個組件,其中比較重要的是Executor、StatementHandler、ParameterHandler和ResultSetHandler。Executor主要負責維護一級緩存和二級緩存,并提供事務管理的相關(guān)操作,它會將數(shù)據(jù)庫相關(guān)操作委托給StatementHandler完成。StatementHandler首先通過ParamHandler完成SQL語句的實參綁定,然后通過java.sql.Statement對象執(zhí)行SQL語句并得到結(jié)果集,最后通過ResultSetHandler完成結(jié)果集的映射,得到結(jié)果對象并返回。如圖展示一條sql的執(zhí)行過程:

2.2.4 插件

Mybatis 自身的功能雖然強大,但是并不能完美切 合所有 的應用場景,因此 MyBatis 提供了插件接口,我們可以通過添加用戶自定義插件的方式對 MyBatis 進行擴展。用 戶自定義插件也可以改變 Mybatis 的默認行為 ,例如,我們可以 攔截 SQL 語句并對其 進行重寫。由于用戶自定義插件會影響 MyBatis 的核心行為,在使用自定義插件之前, 開發(fā)人員需要了解 MyBatis 內(nèi)部的原理,這樣才能編寫出安全、高效的插件。

3.MyBatis 核心類介紹

SqlSession

作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會話,完成必要數(shù)據(jù)庫增刪改查功能

Executor

MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負責SQL語句的生成和查詢緩存的維護

StatementHandler

封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合。

ParameterHandler

負責對用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù),

ResultSetHandler

負責將JDBC返回的ResultSet結(jié)果集對象轉(zhuǎn)換成List類型的集合;

TypeHandler

負責java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換

MappedStatement

MappedStatement維護了一條節(jié)點的封裝,

SqlSource

負責根據(jù)用戶傳遞的parameterObject,動態(tài)地生成SQL語句,將信息封裝到BoundSql對象中,并返回

BoundSql

表示動態(tài)生成的SQL語句以及相應的參數(shù)信息

Configuration

MyBatis所有的配置信息都維持在Configuration對象之中。

4. MyBatis執(zhí)行流程

mybatis學習三部曲:

Mybatis組成

動態(tài)SQL

Config配置

Mapper配置

核心源碼分析

Configuration源碼解析

SqlSessionFactory源碼解析

SqlSession源碼解析

SqlSessionManager源碼解析

手寫Mybatis框架

開源框架學習思維導圖

高清更全思維導圖及視頻資料獲取方式

現(xiàn)在加群即可獲取??群號:923116658

點擊鏈接加入群聊【Java架構(gòu)解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,236評論 0 4
  • 1 Mybatis入門 1.1 單獨使用jdbc編程問題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,415評論 0 38
  • 1 引言# 本文主要講解JDBC怎么演變到Mybatis的漸變過程,重點講解了為什么要將JDBC封裝成Mybait...
    七寸知架構(gòu)閱讀 77,557評論 36 979
  • 此時此刻,躺在廈門酒店床上,思緒一片雜亂,不知從何捋清。 最近,我常常思索自己的過去,在幻想這樣一個問題:如果當初...
    安和若愚閱讀 401評論 0 0
  • 上一章 下一章 首頁 修竹直接從醫(yī)學院跑過來,問新毅是不是喜歡她。修竹的直接,令新毅始料未及。他曾自以為能夠愜...
    GentleC閱讀 172評論 0 1

友情鏈接更多精彩內(nèi)容