偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

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

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

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

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

接口層

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

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

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

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

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

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

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

  • 通過傳入?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)雅的一個設(shè)計,MyBatis 經(jīng)過傳入的參數(shù)值,使用 Ognl 來動態(tài)地構(gòu)造SQL語句,使得MyBatis 有很強的靈活性和擴(kuò)展性。

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

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

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

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

1.緩存機(jī)制

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

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

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

2.反射工具

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

3.類型轉(zhuǎn)換

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

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

4.日志

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

5.資源加載

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

6.解析器

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

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

7.事務(wù)管理

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

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

8.Binding

在調(diào)用 SqlSession 相應(yīng)方法執(zhí)行數(shù)據(jù)庫操作時,需要指定映射文件中定義的 SQL 節(jié)點,如果出現(xiàn)拼寫錯誤,我們只能在運行時才能發(fā)現(xiàn)相應(yīng)的異常。

為了盡早發(fā)現(xiàn)這種錯誤,MyBatis 通過 Binding 模塊將用戶自定義的 Mapper 接口與映射配置文件關(guān)聯(lián)起來,系統(tǒng)可以通過調(diào)用自定義 Mapper 接口中的方法執(zhí)行相應(yīng)的SQL 語句完成數(shù)據(jù)庫操作,從而避免上述問題。

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

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

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

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

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

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

Mybatis核心執(zhí)行流程

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

1.MyBatis配置文件

config.xml:配置了全局配置文件,配置了MyBatis的運行環(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接口有兩個實現(xiàn),一個基本執(zhí)行器(默認(rèn)),一個是緩存執(zhí)行器,SqlSession底層是通過Exector接口操作數(shù)據(jù)庫。

5.MappedStatement

MyBatis的一個底層封裝對象,它包裝了MyBatis配置信息與sql映射信息等。mapper.xml中的insert/select/update/delete標(biāo)簽對應(yīng)一個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)從全局上做了一個拆解,后續(xù)我將重點分析其核心源碼,這樣先全局再局部,這樣更有利于掌握其核心原理實現(xiàn),希望這個框架系列能對你有所用。


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

2022-05-15 23:32:00

元宇宙虛擬世界科技

2025-03-24 00:25:00

Go語言并發(fā)編程

2025-06-30 03:25:00

2022-02-25 20:44:28

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

2025-03-27 00:25:55

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

2010-03-30 11:29:08

BMCCMDBIT運維

2018-08-06 09:40:22

2009-07-20 17:42:04

iBATIS入門

2017-01-19 09:45:53

紅帽

2015-09-09 16:23:58

蘋果核心產(chǎn)品

2009-09-15 16:53:50

2010-09-03 14:18:45

CSS選擇符CSS

2019-01-07 08:00:00

2024-05-30 07:41:22

2013-12-12 13:02:01

2024-10-22 14:42:14

2010-09-25 10:56:32

WebLogicJVM

2024-04-08 00:00:01

數(shù)據(jù)治理核心準(zhǔn)則團(tuán)隊

2022-03-07 15:15:49

物聯(lián)網(wǎng)技術(shù)物聯(lián)網(wǎng)

2023-08-31 22:12:51

低代碼隱患技術(shù)
點贊
收藏

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