Mybatis的使用這里就不介紹了,不知道怎么使用的朋友可以點(diǎn)擊
http://www.mybatis.org/mybatis-3/zh/index.html
這里面的教程很詳細(xì),包括xml的配置、映射、動(dòng)態(tài)sql都有介紹,可以學(xué)習(xí)和使用,本系列的文章將會(huì)更深入的了解MyBatis。
1. ORM簡(jiǎn)介
ORM(Object Relational Mapping)對(duì)象-關(guān)系映射框架,ORM的主要功能就是根據(jù)映射配置文件,完成數(shù)據(jù)在對(duì)象模型與關(guān)系模型之間的映射。
1.1 常見的ORM框架
1.1.1 Hibernate
Hibernate通過hbm.xml映射文件維護(hù)一個(gè)Java類與數(shù)據(jù)庫表的映射關(guān)系,通過Hibernate的映射,Java開發(fā)人員可以用看待Java對(duì)象的角度去看待數(shù)據(jù)庫表中的數(shù)據(jù)行,數(shù)據(jù)庫中多有的表通過hbm.xml配置文件映射之后,都對(duì)應(yīng)一個(gè)Java類。
1.1.2 JPA
JPA(Java Persistence API) 是EJB 3.0中持久化部分的規(guī)范,他可以脫離EJB的體系單獨(dú)作為一個(gè)持久化規(guī)范進(jìn)行使用。
1.1.3 Spring JDBC
嚴(yán)格來說,Spring JDBC并不能算一個(gè)ORM框架,它僅僅是使用模板方式對(duì)原生JDBC進(jìn)行了一層非常薄的封裝,使用Spring JDBC可以幫助開發(fā)人員屏蔽創(chuàng)建數(shù)據(jù)庫連接對(duì)象,Statement對(duì)象,異常處理以及事務(wù)管理的重復(fù)性代碼,提高開發(fā)效率。
1.1.4 MyBatis
MyBatis與前面介紹的持久化框架一樣,可以幫助開發(fā)人員屏蔽底層重復(fù)性的原生JDBC代碼,MyBatis通過映射配置文件或相應(yīng)注解將ResultSet映射為Java對(duì)象,其映射規(guī)則可以嵌套其他映射規(guī)則以及子查詢,從而實(shí)現(xiàn)復(fù)雜的邏輯,也可實(shí)現(xiàn)一對(duì)一,一對(duì)多,多對(duì)多映射以及雙向映射。相比Hibemate更加輕量級(jí),可控性也更高。
2. MyBatis整體架構(gòu)
MyBatis的整體分為三層,分別是基礎(chǔ)支持層,核心處理層和接口層,如圖所示
2.1 基礎(chǔ)支持層
基礎(chǔ)支持層包含整個(gè)MyBatis的基礎(chǔ)模塊,這些模塊為核心處理層的功能提供了良好的支撐,下面簡(jiǎn)單描述下各個(gè)模塊。
2.1.1 數(shù)據(jù)源模塊
數(shù)據(jù)源是實(shí)際開發(fā)中常用的組件之一,現(xiàn)在開源的數(shù)據(jù)源都提供了比較豐富的功能,例如連接池功能、檢測(cè)鏈接狀態(tài)等,選擇性能優(yōu)秀的數(shù)據(jù)源組件對(duì)于提升ORM框架乃至整個(gè)應(yīng)用的性能都是非常重要的。MyBatis自身提供了相應(yīng)的數(shù)據(jù)源實(shí)現(xiàn)。當(dāng)然MyBatis也提供了與第三方接口數(shù)據(jù)源集成的接口,這些功能都位于數(shù)據(jù)源模塊之中。
2.1.2 事務(wù)管理模塊
MyBatis對(duì)數(shù)據(jù)庫中的事務(wù)進(jìn)行了抽象,其自身提供了相應(yīng)的事務(wù)接口和簡(jiǎn)單的實(shí)現(xiàn),在很多場(chǎng)景中,MyBatis會(huì)與Spring框架集成,并由Spring框架管理事務(wù)相關(guān)配置。
2.1.3 緩存模塊
在優(yōu)化系統(tǒng)性能時(shí),優(yōu)化數(shù)據(jù)庫性能是非常重要的一個(gè)環(huán)節(jié),而添加緩存則是優(yōu)化數(shù)據(jù)庫時(shí)最有效的手段之一。正確、合理的使用緩存可以將一部分?jǐn)?shù)據(jù)庫請(qǐng)求攔截在緩存這一層,這就能夠減少相當(dāng)一部分?jǐn)?shù)據(jù)庫的壓力。
MyBatis中提供了一級(jí)緩存和二級(jí)緩存,而這兩級(jí)緩存都依賴于基礎(chǔ)支持層中的緩存模塊實(shí)現(xiàn),這里需要讀者注意的是MyBatis中自帶的兩級(jí)緩存以及整個(gè)應(yīng)用是運(yùn)行在一個(gè)JVM中的,共享一塊堆內(nèi)存,如果這兩級(jí)緩存中的數(shù)據(jù)量較大,則可能影響系統(tǒng)中其他功能的運(yùn)行,所以當(dāng)需要緩存大量數(shù)據(jù)時(shí),優(yōu)先考慮使用Redis、Mongodb、Memcache等緩存產(chǎn)品。
2.1.4 Binding模塊
在調(diào)用 SqISession 相應(yīng)方法執(zhí)行數(shù)據(jù)庫操作時(shí),需要指定映射文件中定義的 SQL 節(jié)點(diǎn),如果出現(xiàn)拼寫錯(cuò)誤,我們只能在運(yùn)行時(shí)才能發(fā)現(xiàn)相應(yīng)的 異常 。 為了盡早發(fā)現(xiàn)這種錯(cuò)誤, MyBatis 通過 Binding 模塊將用戶自定義的 Mapper 接 口與映射配置文件關(guān)聯(lián)起來,系統(tǒng)可以通過調(diào)用自定義 Mapper 接口中的方法執(zhí)行相應(yīng)的 SQL 語句完成數(shù)據(jù)庫操作,從而避免上述問題。值得讀者注意的是,開發(fā)人員無須編寫自定義 Mapper接口的實(shí)現(xiàn), MyBatis會(huì)自動(dòng)為 其創(chuàng)建動(dòng)態(tài)代理對(duì)象。在有些場(chǎng)景中,自定義 Mapper接口可以完全代替映射配置文件, 但有的映射規(guī)則和 SQL 語句的定義還是寫在映射配置文件中比較方便,例如動(dòng)態(tài) SQL 語句的定義 。
2.1.5 反射模塊
Java中的反射功能雖然強(qiáng)大,但對(duì)大多數(shù)開發(fā)人員來說,寫出高質(zhì)量的反射代碼還是有一定難度的。MyBatis中專門提供了反射模塊,該模塊對(duì)Java原生的反射進(jìn)行了一系列優(yōu)化,例如緩存了類的元數(shù)據(jù),提高了反射的性能。
2.1.6 類型轉(zhuǎn)換模塊
MyBatis 為簡(jiǎn)化配置文件提供了別名機(jī)制 , 該機(jī)制是類型轉(zhuǎn)換模 塊的主要功能之一 。 類型轉(zhuǎn)換模塊的另一個(gè)功能是實(shí)現(xiàn) JDBC 類型與 Java 類型之間的 轉(zhuǎn)換,該功能在為 SQL 語句綁定實(shí)參以及 映射查詢結(jié)果集 時(shí)都會(huì)涉及。在為 SQL 語 句綁定實(shí)參時(shí), 會(huì)將數(shù)據(jù)由 Java類型轉(zhuǎn)換成 JDBC 類型;而在映射結(jié)果集時(shí),會(huì)將數(shù) 據(jù)由 JDBC類型轉(zhuǎn)換成 Java類型。
2.1.7 日志模塊
無論在開發(fā)測(cè)試環(huán)境中,還是在線上生產(chǎn)環(huán)境中,日志在整個(gè)系統(tǒng)中的地位都是非常重要的。良好的日志功能可以幫助開發(fā)人員和測(cè)試人員快速定位 Bug代碼,也可以幫助運(yùn)維人員快速定位性能瓶頸、等問題 。 目前的 Java 世界中存在很多優(yōu)秀的日志框架,例如 Log4j、 Log4j2, slf4j等。 MyBatis作為一個(gè)設(shè)計(jì)優(yōu)良的框架,除了提供詳細(xì)的日志輸出信息,還要能夠集成多種日志框架,其日志模塊的 一個(gè)主要功能就是集成第三方日志框架。
2.1.8 資源加載模塊
資源加載模塊主要是對(duì)類加載器進(jìn)行封裝,確定類的使用順序,并提供了加載類文件以及其他資源文件的功能。
2.1.9 解析器模塊
解析器模塊主要提供了兩個(gè)功能:一個(gè)功能是對(duì)XPath進(jìn)行封裝,為MyBatis初始化時(shí)解析mybatis-config.xml配置文件以及映射配置文件提供支持;另一個(gè)功能是為處理動(dòng)態(tài)sql語句中的占位符提供支持。
2.2 核心處理層
在MyBatis的核心處理層中實(shí)現(xiàn)了MyBatis的核心處理流程,其中包括MyBatis的初始化以及完成一次數(shù)據(jù)庫操作的全部流程,而這些都是基于基礎(chǔ)支持層實(shí)現(xiàn)的。
2.2.1 配置解析
在 MyBatis 初始化過程中,會(huì)加載 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息會(huì)形成相應(yīng)的對(duì)象并保存到 Configuration 對(duì)象中 。例如,節(jié)點(diǎn)(即ResultSet 的映射規(guī)則) 會(huì)被解析成 ResultMap 對(duì)象,定義的節(jié)點(diǎn)(即屬性映射)會(huì)被解析成 ResultMapping對(duì)象。之后,利用該 Configuration對(duì)象創(chuàng)SqlSessionFactor對(duì)象。待 MyBatis 初始化之后,開發(fā)人員可以通過初始化得到SqlSessionFactory創(chuàng)建 SqlSession 對(duì)象并完成數(shù)據(jù)庫操作。
2.2.2 參數(shù)映射-SQL解析
拼湊 SQL 語句是一件煩瑣且易出錯(cuò)的過程,為了將開發(fā)人員從這項(xiàng)枯燥無趣的工作中解脫出來,MyBatis實(shí)現(xiàn)動(dòng)態(tài)SQL語句的功能,提供了多種動(dòng)態(tài) SQL語句對(duì)應(yīng)的節(jié)點(diǎn), 例如,節(jié)點(diǎn)、節(jié)點(diǎn)、節(jié)點(diǎn)等 。通過這些節(jié)點(diǎn)的組合使用,開發(fā)人員可以寫出幾乎滿足所有需求的動(dòng)態(tài) SQL語句。 MyBatis 中的scripting模塊會(huì)根據(jù)用戶傳入的實(shí)參,解析映射文件中定義的動(dòng)態(tài)SQL節(jié)點(diǎn),并形成數(shù)據(jù)庫可執(zhí)行的SQL 語句 。之后會(huì)處理 SQL 語句中的占位符,綁定用戶傳入的實(shí)參。
2.2.3 SQL執(zhí)行
SQL語句的執(zhí)行涉及多個(gè)組件,其中比較重要的是Executor、StatementHandler、ParameterHandler和ResultSetHandler。Executor主要負(fù)責(zé)維護(hù)一級(jí)緩存和二級(jí)緩存,并提供事務(wù)管理的相關(guān)操作,它會(huì)將數(shù)據(jù)庫相關(guān)操作委托給StatementHandler完成。StatementHandler首先通過ParamHandler完成SQL語句的實(shí)參綁定,然后通過java.sql.Statement對(duì)象執(zhí)行SQL語句并得到結(jié)果集,最后通過ResultSetHandler完成結(jié)果集的映射,得到結(jié)果對(duì)象并返回。如圖展示一條sql的執(zhí)行過程:
2.2.4 插件
Mybatis 自身的功能雖然強(qiáng)大,但是并不能完美切 合所有 的應(yīng)用場(chǎng)景,因此 MyBatis 提供了插件接口,我們可以通過添加用戶自定義插件的方式對(duì) MyBatis 進(jìn)行擴(kuò)展。用 戶自定義插件也可以改變 Mybatis 的默認(rèn)行為 ,例如,我們可以 攔截 SQL 語句并對(duì)其 進(jìn)行重寫。由于用戶自定義插件會(huì)影響 MyBatis 的核心行為,在使用自定義插件之前, 開發(fā)人員需要了解 MyBatis 內(nèi)部的原理,這樣才能編寫出安全、高效的插件。
3.MyBatis 核心類介紹
SqlSession
作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會(huì)話,完成必要數(shù)據(jù)庫增刪改查功能
Executor
MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)
StatementHandler
封裝了JDBC Statement操作,負(fù)責(zé)對(duì)JDBC statement 的操作,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合。
ParameterHandler
負(fù)責(zé)對(duì)用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù),
ResultSetHandler
負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類型的集合;
TypeHandler
負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換
MappedStatement
MappedStatement維護(hù)了一條節(jié)點(diǎn)的封裝,
SqlSource
負(fù)責(zé)根據(jù)用戶傳遞的parameterObject,動(dòng)態(tài)地生成SQL語句,將信息封裝到BoundSql對(duì)象中,并返回
BoundSql
表示動(dòng)態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息
Configuration
MyBatis所有的配置信息都維持在Configuration對(duì)象之中。
4. MyBatis執(zhí)行流程
mybatis學(xué)習(xí)三部曲:
Mybatis組成
動(dòng)態(tài)SQL
Config配置
Mapper配置
核心源碼分析
Configuration源碼解析
SqlSessionFactory源碼解析
SqlSession源碼解析
SqlSessionManager源碼解析
手寫Mybatis框架
開源框架學(xué)習(xí)思維導(dǎo)圖
高清更全思維導(dǎo)圖及視頻資料獲取方式
現(xiàn)在加群即可獲取??群號(hào):923116658
點(diǎn)擊鏈接加入群聊【Java架構(gòu)解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb