成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入詳解Mybatis的架構(gòu)原理與六大核心流程

開發(fā) 架構(gòu)
MyBatis 是 Java 生態(tài)中非常著名的一款 ORM 框架,目前在一線互聯(lián)網(wǎng)大廠中應(yīng)用廣泛,Mybatis已經(jīng)成為了一個(gè)必會框架。

MyBatis 是 Java 生態(tài)中非常著名的一款 ORM 框架,目前在一線互聯(lián)網(wǎng)大廠中應(yīng)用廣泛,Mybatis已經(jīng)成為了一個(gè)必會框架。

如果你想要進(jìn)入一線大廠,能夠熟練使用 MyBatis 開發(fā)已經(jīng)是一項(xiàng)非?;镜募寄?,同時(shí)大廠也更希望自己的開發(fā)人員深入了解 MyBatis 框架的原理和核心實(shí)現(xiàn)。

從這個(gè)角度看,理解 MyBatis 原理,閱讀 MyBatis核心源碼,這樣更有利于提高職場競爭力。

在深入了解Mybatis的源碼之前,我們先了解一下Mybatis的整體架構(gòu)和工作原理,這樣有助于我們在閱讀源碼過程中了解思路和流程。

Mybatis架構(gòu)設(shè)計(jì)

我們把Mybatis的功能架構(gòu)分為三層:

  • API接口層
  • 數(shù)據(jù)處理層
  • 基礎(chǔ)支撐層

接口層

接口層:主要就是和數(shù)據(jù)庫交互,提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫,接口層一接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。

以使用Mapper接口為例,將配置文件中的每一個(gè) 節(jié)點(diǎn)抽象為一個(gè) Mapper 接口,這個(gè)接口中聲明的方法和跟Mapper.xml中的 節(jié)點(diǎn)項(xiàng)對應(yīng)。

id值對應(yīng)方法名稱,parameterType 值對應(yīng)方法的入?yún)㈩愋?,而resultMap 值則對應(yīng)返回值類型。

配置好后,MyBatis 會根據(jù)接口聲明的方法信息,通過動態(tài)代理機(jī)制生成一個(gè)Mapper 實(shí)例,當(dāng)調(diào)用接口方法時(shí),根據(jù)這個(gè)方法的方法名和參數(shù)類型,確定Statement Id,底層還是通過 SqlSession.select/update( “statementId”, parameter) 等來實(shí)現(xiàn)對數(shù)據(jù)庫的操作。

數(shù)據(jù)處理層

數(shù)據(jù)處理層:可以說是MyBatis 的核心,負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等,它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫操作。

從大的方面上講,它要完成兩個(gè)功能:

  • 通過傳入?yún)?shù)構(gòu)建動態(tài)SQL語句
  • SQL語句的執(zhí)行以及封裝查詢結(jié)果集

1.通過傳入?yún)?shù)構(gòu)建動態(tài)SQL語句

動態(tài)語句生成能夠說是MyBatis框架很是優(yōu)雅的一個(gè)設(shè)計(jì),MyBatis 經(jīng)過傳入的參數(shù)值,使用 Ognl 來動態(tài)地構(gòu)造SQL語句,使得MyBatis 有很強(qiáng)的靈活性和擴(kuò)展性。

參數(shù)映射指的是對于java 數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的轉(zhuǎn)換,這里有包括兩個(gè)過程:

  • 查詢階段
  • 查詢結(jié)果集轉(zhuǎn)換階段

查詢階段要將java類型的數(shù)據(jù),轉(zhuǎn)換成jdbc類型的數(shù)據(jù),經(jīng)過 preparedStatement.setXXX() 來設(shè)值;

另外一個(gè)就是對resultset查詢結(jié)果集的jdbcType 數(shù)據(jù)轉(zhuǎn)換成java 數(shù)據(jù)類型。

2. SQL語句的執(zhí)行以及封裝查詢結(jié)果集

動態(tài)SQL語句生成以后,MyBatis 將執(zhí)行SQL語句,并將可能返回的結(jié)果集轉(zhuǎn)換成List 列表。

MyBatis 在對結(jié)果集的處理中,支持結(jié)果集關(guān)系一對多和多對一的轉(zhuǎn)換,而且有兩種支持方式,一種為嵌套查詢語句的查詢,還有一種是嵌套結(jié)果集的查詢。

基礎(chǔ)支撐層

基礎(chǔ)支撐層是整個(gè)MyBatis框架的地基,負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件,為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

1.緩存機(jī)制

數(shù)據(jù)庫是實(shí)踐生成中非常核心的存儲,很多業(yè)務(wù)數(shù)據(jù)都會落地到數(shù)據(jù)庫,所以數(shù)據(jù)庫性能的優(yōu)劣直接影響了上層業(yè)務(wù)系統(tǒng)的優(yōu)劣。

我們很多線上業(yè)務(wù)都是讀多寫少的場景,在數(shù)據(jù)庫遇到瓶頸時(shí),緩存是最有效、最常用的手段之一,正確使用緩存可以將一部分?jǐn)?shù)據(jù)庫請求攔截在緩存這一層,這就能夠減少一部分?jǐn)?shù)據(jù)庫的壓力,提高系統(tǒng)性能。

除了使用 Redis、Memcached 等外置的第三方緩存以外,持久化框架一般也會自帶內(nèi)置的緩存,例如,MyBatis 就提供了一級緩存和二級緩存,具體實(shí)現(xiàn)位于基礎(chǔ)支撐層的緩存模塊中。

2.反射工具

該模塊對 Java 原生的反射進(jìn)行了良好的封裝,提供了更加簡潔易用的 API ,方便上層使調(diào)用,并且對反射操作進(jìn)行了一系列優(yōu)化,例如緩存了類的元數(shù)據(jù),提高了反射操作的性能。

3.類型轉(zhuǎn)換

類型轉(zhuǎn)換模塊提供了兩個(gè)主要功能,一個(gè)功能是別名機(jī)制,MyBatis 為了簡化配置文件提供了別名機(jī)制。

另一個(gè)功能是實(shí)現(xiàn) JDBC 類型與 Java 類型之間的轉(zhuǎn)換,該功能在為 SQL 語句綁定實(shí)參以及映射查詢結(jié)果集時(shí)都會涉及。

4.日志

提供詳細(xì)的日志輸出信息,并且能夠集成多種日志框架,其日志模塊的一個(gè)主要功能就是集成第三方日志框架。

5.資源加載

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

6.解析器

解析器模塊主要提供兩個(gè)功能,一個(gè)功能是對 XPath 進(jìn)行封裝,為 MyBatis 初始化時(shí)解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。

另一個(gè)功能是為處理動態(tài) SQL 語句中的占位符提供支持。

7.事務(wù)管理

持久層框架一般都會提供一套事務(wù)管理機(jī)制實(shí)現(xiàn)數(shù)據(jù)庫的事務(wù)控制,MyBatis 對數(shù)據(jù)庫中的事務(wù)進(jìn)行了一層簡單的抽象,提供了簡單易用的事務(wù)接口和實(shí)現(xiàn)。

一般情況下,Java 項(xiàng)目都會集成 Spring,并由 Spring 框架管理事務(wù)。

8.Binding

在調(diào)用 SqlSession 相應(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ù)庫操作,從而避免上述問題。

需要注意的是,無須編寫自定義 Mapper 接口的實(shí)現(xiàn),具體的Mapper接口實(shí)現(xiàn)MyBatis 會自動為其創(chuàng)建動態(tài)代理對象。

9.數(shù)據(jù)源

對于 ORM 框架而言,數(shù)據(jù)源的組織是一個(gè)非常重要的一部分,這直接影響到框架的性能問題。

數(shù)據(jù)庫連接是一項(xiàng)有限的昂貴資源,一個(gè)數(shù)據(jù)庫連接對象均對應(yīng)一個(gè)物理數(shù)據(jù)庫連接,每次操作都打開一個(gè)物理連接,使用完都關(guān)閉連接,這樣造成系統(tǒng)的性能低下。

數(shù)據(jù)庫連接池的解決方案是在應(yīng)用程序啟動時(shí)建立足夠的數(shù)據(jù)庫連接,并將這些連接組成一個(gè)連接池,由應(yīng)用程序動態(tài)地對池中的連接進(jìn)行申請、使用和釋放。

打開Mybatis源碼找到datasource包下就可以看到連接池的實(shí)現(xiàn),如下圖所示:

Mybatis核心執(zhí)行流程

mybatis的總體執(zhí)行流程,總體如下六大步驟:

1.MyBatis配置文件

config.xml:配置了全局配置文件,配置了MyBatis的運(yùn)行環(huán)境等信息。

mapper,xml:sql的映射文件,配置了操作數(shù)據(jù)庫的sql語句,此文件需在config.xml中加載。

2.SqlSessionFactory

通過MyBatis環(huán)境等配置信息構(gòu)造SqlSessionFactory(會話工廠)。

3.SqlSession

通過會話工廠創(chuàng)建SqlSession(會話),對數(shù)據(jù)庫進(jìn)行增刪改查操作。

4.Exector執(zhí)行器

MyBatis底層自定義了Exector執(zhí)行器接口來具體操作數(shù)據(jù)庫,Exector接口有兩個(gè)實(shí)現(xiàn),一個(gè)基本執(zhí)行器(默認(rèn)),一個(gè)是緩存執(zhí)行器,SqlSession底層是通過Exector接口操作數(shù)據(jù)庫。

5.MappedStatement

MyBatis的一個(gè)底層封裝對象,它包裝了MyBatis配置信息與sql映射信息等。mapper.xml中的insert/select/update/delete標(biāo)簽對應(yīng)一個(gè)MappedStatement對象。標(biāo)簽的id就是MappedStatement的id。

MappedStatement對sql執(zhí)行輸入?yún)?shù)進(jìn)行定義,包括HashMap、基本類型、pojo、Executor通過MappedStatement在執(zhí)行sql前將輸入的Java對象映射至sql中,輸入?yún)?shù)映射就是JDBC編程對preparedStatement設(shè)置參數(shù)。

MappedStatement對sql執(zhí)行輸出結(jié)果進(jìn)行定義,包括HashMap、基本類型、pojo,Executor通過MappedStatement在執(zhí)行sql后將輸出結(jié)果映射至Java對象中,輸出結(jié)果映射就是JDBC編程對結(jié)果的解析處理過程。

到此我就把Mybatis的架構(gòu)從全局上做了一個(gè)拆解,后續(xù)我將重點(diǎn)分析其核心源碼,這樣先全局再局部,這樣更有利于掌握其核心原理實(shí)現(xiàn),希望這個(gè)框架系列能對你有所用。


責(zé)任編輯:武曉燕 來源: mikechen的互聯(lián)網(wǎng)架構(gòu)
相關(guān)推薦

2022-05-15 23:32:00

元宇宙虛擬世界科技

2025-03-27 00:25:55

微服務(wù)架構(gòu)技術(shù)

2025-03-24 00:25:00

Go語言并發(fā)編程

2018-08-06 09:40:22

2022-02-25 20:44:28

框架深度學(xué)習(xí)架構(gòu)

2015-09-09 16:23:58

蘋果核心產(chǎn)品

2009-09-15 16:53:50

2010-03-30 11:29:08

BMCCMDBIT運(yùn)維

2024-05-30 07:41:22

2024-10-22 14:42:14

2013-12-12 13:02:01

2010-09-25 10:56:32

WebLogicJVM

2017-01-19 09:45:53

紅帽

2009-07-20 17:42:04

iBATIS入門

2019-01-07 08:00:00

2010-09-03 14:18:45

CSS選擇符CSS

2011-03-16 10:44:19

2013-08-23 10:18:06

Hadoop

2016-07-06 11:16:47

2010-09-09 10:54:58

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产91久久久久蜜臀青青天草二 | 欧美精品啪啪 | 午夜av一区二区 | 国产高清一区二区三区 | 波多野结衣av中文字幕 | 天天摸天天干 | 久久久精品一区 | 久久久国产亚洲精品 | 久久国产精品一区二区三区 | avmans最新导航地址 | 男女爱爱福利视频 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 欧产日产国产精品v | 99综合在线| 日韩电影免费观看中文字幕 | 日韩精品在线看 | 欧美日韩专区 | 国产一区亚洲 | 免费看黄色国产 | 天天综合国产 | 欧美一a| 久久精品视频在线观看 | 午夜视频在线 | 色综合视频| 精品视频免费 | 亚洲精品性视频 | 中文字幕99 | 久久精品综合网 | 国产免费一二三区 | 国产精品性做久久久久久 | 九九99精品 | 青春草国产| 人人澡人人爱 | 69av在线视频 | 日一区二区| 欧美日日| 成人精品视频在线 | 午夜www| 一区二区三区免费网站 | 国产精品久久久久久久免费大片 | 欧美最猛性xxxxx亚洲精品 |