自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

探討Mybatis最硬核的API,你知道幾個?

開發(fā) 架構(gòu)
本文中,我們主要先把 Mybatis 的架構(gòu)/層次鋪開,俯視 Mybatis 架構(gòu)的設(shè)計全貌,再把幾個硬核的 API 詳細(xì)消化。

1、Mybatis 架構(gòu)與核心API

不出意外的話,在后續(xù)源碼剖析相關(guān)文章中,我們會對 Mybatis 的源碼進(jìn)行一次大掃蕩,一起挖掘每一處值得大家深入理解/記憶的知識點(diǎn)。而在本文中,我們主要先把 Mybatis 的架構(gòu)/層次鋪開,俯視 Mybatis 架構(gòu)的設(shè)計全貌,再把幾個硬核的 API 詳細(xì)消化。

整體順序脈絡(luò),希望讓你有所期待 ~

[[375611]]

我們先簡單揭開 Mybatis 神秘的源碼包,

瞅瞅 Ta 大致目錄結(jié)構(gòu) :

Mybatis最硬核的API你知道幾個?

看,Mybatis 的源代碼包整齊劃一排在 org.apache.ibatis 目錄下,基本設(shè)計用途我簡單梳理成上面這張圖,方便大家直觀理解,當(dāng)然只看源碼包目錄結(jié)構(gòu),難免會顯得枯燥無物,所以我們再看一下,其實(shí) Mybatis 的源碼包功能上可以是這么劃分:

Mybatis最硬核的API你知道幾個?

上圖讓我們對 Mybatis 的架構(gòu)有了抽象的理解。

然而,實(shí)際上具體的職能分工,核心 API 的場景應(yīng)用,到底會是怎樣一套流程呈現(xiàn)呢?

看下面這幅功能架構(gòu)設(shè)計,或許你能更好的理解。

 Mybatis最硬核的API你知道幾個?

根據(jù) Mybatis 功能架構(gòu)我們劃分成三層:

  • 接口層:該層提供一系列接口讓用戶直接參與使用,包含信息配置與實(shí)際數(shù)據(jù)操作調(diào)用。配置方式包括:基于 XML 配置方式、基于 Java API 配置方式兩種方式,用戶也可以通過接口層 API 對數(shù)據(jù)庫發(fā)起增刪改查等操作的請求, 本層接口會把接收到的調(diào)用請求交給數(shù)據(jù)處理層的構(gòu)件去處理。
  • 數(shù)據(jù)處理層:該層是 Mybatis 的核心層,負(fù)責(zé)數(shù)據(jù)處理,主要包括SQL 參數(shù)映射解析、SQL 語句的實(shí)際執(zhí)行、執(zhí)行結(jié)果集的映射處理等。
  • 框架支撐層:該層屬于 Mybatis 的后勤保障層,包括數(shù)據(jù)庫連接管理、事務(wù)把控管理、配置加載與緩存處理、日志處理、異常處理等,提供基礎(chǔ)支撐能力,保障上層的數(shù)據(jù)處理。

我們知道,Mybatis 框架讓用戶只需要提供配置信息,并且專注于 SQL 的編寫即可,對于連接管理數(shù)據(jù)庫/事務(wù),或?qū)嶋H的 SQL 參數(shù)映射/語句執(zhí)行/結(jié)果集映射等操作,作為用戶都并不需要操心和參與。

但是,好奇的我們其實(shí)想知道,Mybatis 核心部分的數(shù)據(jù)處理在整體流程中,是如何支撐用戶請求?同時各個構(gòu)件之間交互,又是怎樣流轉(zhuǎn)呢?

很巧,我這里有一張圖,介紹了整體流程:

Mybatis最硬核的API你知道幾個?

根據(jù)以上框架流程圖進(jìn)行講解:

  • 創(chuàng)建配置并調(diào)用API :這一環(huán)節(jié)發(fā)生在應(yīng)用程序端,是開發(fā)人員在實(shí)際應(yīng)用程序中進(jìn)行的兩步操作,第一步創(chuàng)建核心配置文件 Configuration.xml 和映射文件 mapper.xml (通過注解方式也可創(chuàng)建以上兩種配置),準(zhǔn)備好基礎(chǔ)配置和 SQL 語句之后;第二步就是直接調(diào)用 Mybatis 框架中的數(shù)據(jù)庫操作接口。
  • 加載配置并初始化 :Mybatis 框架會根據(jù)應(yīng)用程序端提供的核心配置文件與 SQL 映射文件的內(nèi)容,使用資源輔助類 Resources 把配置文件讀取成輸入流,然后通過對應(yīng)的解析器解析并封裝到 Configuration 對象和 MappedStatement 對象,最終把對象存儲在內(nèi)存之中。
  • 創(chuàng)建會話并接收請求 :在 Mybatis 框架加載配置并初始化配置對象之后,會話工廠構(gòu)建器 SqlSessionFactoryBuilder 同時創(chuàng)建會話工廠 SqlSessionFactory,會話工廠會根據(jù)應(yīng)用程序端的請求,創(chuàng)建會話 SqlSession,以便應(yīng)用程序端進(jìn)行數(shù)據(jù)庫交互。
  • 處理請求 :SqlSession 接收到請求之后,實(shí)際上并沒有進(jìn)行處理,而是把請求轉(zhuǎn)發(fā)給執(zhí)行器 Executor,執(zhí)行器再分派到語句處理器 StatementHandler ,語句處理器會結(jié)合參數(shù)處理器 ParameterHandler ,進(jìn)行數(shù)據(jù)庫操作(底層封裝了 JDBC Statement 操作)。
  • 返回處理結(jié)果 :每個語句處理器 StatementHandler 處理完成數(shù)據(jù)庫操作之后,會協(xié)同 ResultSetHandler 以及類型處理器 TypeHandler ,對底層 JDBC 返回的結(jié)果集進(jìn)行映射封裝,最終返回封裝對象。

針對以上總體框架流程涉及到的這些硬核 API,下面我們逐個展開介紹,但不會詳細(xì)剖析源碼與原理,包括構(gòu)建細(xì)節(jié),因?yàn)檫@些我們在后續(xù)的源碼剖析章節(jié)中都會詳細(xì)分析。

2、Configuration – 全局配置對象

對于 Mybatis 的全局配置對象 Configuration,我相信無論是初學(xué)者還是資深玩家,都不會陌生。整個 Mybatis 的宇宙,都圍繞著 Configuration 轉(zhuǎn)。Configuration 對象的結(jié)構(gòu)和 config.xml 配置文件的內(nèi)容幾乎相同,涵蓋了properties (屬性),settings (設(shè)置),typeAliases (類型別名),typeHandlers (類型處理器),objectFactory (對象工廠),mappers (映射器)等等,之前我們有專門的一篇文章詳細(xì)進(jìn)行介紹,感興趣的朋友往上翻到目錄列表,找到 《Mybatis系列全解(四):全網(wǎng)最全!Mybatis配置文件XML全貌詳解》 一文詳細(xì)品味一番吧。

Mybatis最硬核的API你知道幾個?

配置對象 Configuration 通過解析器 XMLConfigBuilder 進(jìn)行解析,把全局配置文件 Config.xml 與 映射器配置文件 Mapper.xml 中的配置信息全部構(gòu)建成完整的 Configuration 對象,后續(xù)我們源碼分析時詳細(xì)剖析整個過程。

3、Resources – 資源輔助類

我們知道,像 Configuration 和 Mapper 的配置信息存放在 XML 文件中,Mybatis 框架在構(gòu)建配置對象時,必須先把 XML 文件信息加載成流,再做后續(xù)的解析封裝,而 Resources 作為資源的輔助類,恰恰干的就是這個活,無論是通過加載本地資源或是加載遠(yuǎn)程資源,最終都會通過 類加載器 訪問資源文件并輸出文件流。

Mybatis最硬核的API你知道幾個?
  1. //加載核心配置文件 
  2. InputStream resourceAsStream =  
  3.     Resources.getResourceAsStream("Config.xml"); 

 Resources 實(shí)實(shí)在在提供了一系列方法分分鐘解決你的文件讀取加載問題:

Mybatis最硬核的API你知道幾個?

4、SqlSessionFactoryBuilder – 會話工廠構(gòu)建器

我們一撞見 xxxBuilder ,就大致能知道它是某類對象的構(gòu)建器,這里 SqlSessionFactoryBuilder 也是一樣,它是 Mybatis 中的一個會話工廠構(gòu)建器,在資源輔助類 Resources 讀取到文件流信息之后,它負(fù)責(zé)解析文件流信息并構(gòu)建會話工廠 SqlSessionFactory。(解析的配置文件包含:全局配置 Configuration 與映射器 Mapper)

Mybatis最硬核的API你知道幾個?

在程序應(yīng)用端,我們一般使用 SqlSessionFactoryBuilder 直接構(gòu)建會話工廠:

  1. // 獲得sqlSession工廠對象 
  2. SqlSessionFactory sqlSessionFactory =  
  3.     new SqlSessionFactoryBuilder().build(resourceAsStream); 

 當(dāng)然,如果你集成了 Spring 框架的項目,則不需要自己手工去構(gòu)建會話工廠,直接在 Spring 配置文件中指定即可,例如指定一個 bean 對象,id 是 sqlSessionFactory,而 class 類指定為 org.mybatis.spring.SqlSessionFactoryBean 。

SqlSessionFactoryBuilder 內(nèi)部通過解析器 XMLConfigBuilder 解析了文件流,同時封裝成為配置對象 Configuration ,再把 Configuration 對象進(jìn)行傳遞并構(gòu)建實(shí)例。

  1. public SqlSessionFactory build( 
  2.     InputStream inputStream,  
  3.     String environment,  
  4.     Properties properties) { 
  5.     
  6.       
  7.       // 配置解析器解析 
  8.       XMLConfigBuilder parser =  
  9.           new XMLConfigBuilder( 
  10.             inputStream,environment, properties); 
  11.      
  12.       // 最終實(shí)例會話工廠 
  13.       return build(parser.parse());  
  14.      

 最終實(shí)例會話工廠,其實(shí) Mybatis 默認(rèn)實(shí)現(xiàn)是 new 了一個DefaultSqlSessionFactory 實(shí)例。

  1. // 最終實(shí)例會話工廠 
  2. public SqlSessionFactory build(Configuration config) { 
  3.     
  4.     return new DefaultSqlSessionFactory(config); 

 會話工廠構(gòu)建器 SqlSessionFactoryBuilder 應(yīng)用了構(gòu)建者模式,主要目的就是為了構(gòu)建 SqlSessionFactory 對象,以便后續(xù)生產(chǎn) SqlSession 對象,這個構(gòu)造器基本上算是 Mybatis 框架的入口構(gòu)建器,它提供了一系列多態(tài)方法 build(),支持用戶使用 XML 配置文件或 Java API (Properties)來構(gòu)建會話工廠 SqlSessionFactory 實(shí)例。

SqlSessionFactoryBuilder 的一生只為成就 SqlSessionFactory,當(dāng) SqlSessionFactory 一經(jīng)實(shí)例,SqlSessionFactoryBuilder 使命完成,便可消亡,便可被丟棄。

Mybatis最硬核的API你知道幾個?

因此 SqlSessionFactoryBuilder 實(shí)例的最佳作用域是 方法作用域 (也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創(chuàng)建多個 SqlSessionFactory 實(shí)例,但最好不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactoryBuilder 中靈活構(gòu)建會話工廠的一系列接口:

Mybatis最硬核的API你知道幾個?

5、SqlSessionFactory – 會話工廠

會話工廠 SqlSessionFactory 是一個接口,作用是生產(chǎn)數(shù)據(jù)庫會話對象 SqlSession ,有兩個實(shí)現(xiàn)類:

  • **DefaultSqlSessionFactory **(默認(rèn)實(shí)現(xiàn))
  • **SqlSessionManager **(僅多實(shí)現(xiàn)了一個 Sqlsession 接口,已棄用)

在介紹會話工廠構(gòu)建器 SqlSessionFactoryBuilder 的時候,我們了解到構(gòu)建器默認(rèn)創(chuàng)建了 DefaultSqlSessionFactory 實(shí)例,并且會話工廠本身會綁定一個重要的屬性 Configuration 對象,在生產(chǎn)會話時,最終也會把 Configuration 配置對象傳遞并設(shè)置到會話 SqlSession 上。

Mybatis最硬核的API你知道幾個?

會話工廠可以簡單創(chuàng)建 SqlSession 實(shí)例:

  1. // 創(chuàng)建 SqlSession 實(shí)例 
  2. SqlSession session = sqlSessionFactory.openSession(); 

 會話工廠創(chuàng)建 SqlSession 時,會綁定數(shù)據(jù)源、事務(wù)處理、執(zhí)行器等等,默認(rèn)會話工廠實(shí)現(xiàn)類 DefaultSqlSessionFactory 在創(chuàng)建會話對象時,最終都會調(diào)用 openSessionFromDataSource 方法 ,即是如此實(shí)現(xiàn):

  1. // 每一個 openSession 最終都會調(diào)用此處 
  2. private SqlSession openSessionFromDataSource( 
  3.     ExecutorType execType,  
  4.     TransactionIsolationLevel level,  
  5.     boolean autoCommit) { 
  6.     
  7.      
  8.     // 環(huán)境配置 
  9.     final Environment environment =  
  10.         configuration.getEnvironment(); 
  11.      
  12.     // 事務(wù)工廠 
  13.     final TransactionFactory transactionFactory =  
  14.         getTransactionFactoryFromEnvironment(environment); 
  15.      
  16.     // 事務(wù) 
  17.     Transaction tx = 
  18.         transactionFactory.newTransaction( 
  19.         environment.getDataSource(),  
  20.         level,  
  21.         autoCommit); 
  22.      
  23.     // 執(zhí)行器 
  24.     final Executor executor =  
  25.         configuration.newExecutor(tx, execType); 
  26.      
  27.     // 最終生成會話 
  28.     return new DefaultSqlSession( 
  29.           configuration, executor, autoCommit); 
  30.      
  31.   } 

 另外,會話工廠其實(shí)提供了一系列接口來靈活生產(chǎn)會話 SqlSession,你可以指定:

  • 事務(wù)處理 :你希望在 session 作用域中使用/開啟事務(wù)作用域(也就是不自動提交事務(wù)),還是使用自動提交(auto-commit),sqlSession 默認(rèn)不提交事務(wù),對于增刪改操作時需要手動提交事務(wù)。
  • 數(shù)據(jù)庫連接 :你希望 MyBatis 幫你從已配置的數(shù)據(jù)源獲取連接,還是使用自己提供的連接,可以動態(tài)創(chuàng)建數(shù)據(jù)源對象 Connection。
  • 執(zhí)行器類型 :你希望指定某類執(zhí)行器來創(chuàng)建/執(zhí)行/預(yù)處理語句,可以有普通執(zhí)行器(SimpleExecutor),或復(fù)用執(zhí)行器(ReuserExecutor)、還是批量執(zhí)行器(BatchExecutor)等,下面介紹執(zhí)行器時會詳細(xì)說明。
  • 事務(wù)隔離級別支持 :支持 JDBC 的五個隔離級別(NONE、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE),對于事務(wù)相關(guān)的內(nèi)容,我們后續(xù) 《spring 系列全解》 會詳細(xì)講,這里簡單說明一下就是事務(wù)隔離級別主要為了解決例如臟讀、不可重復(fù)讀、幻讀等問題,使用不同的事務(wù)隔離級別勢必會導(dǎo)致不同的數(shù)據(jù)庫執(zhí)行效率,因此我們再不同的系統(tǒng)/功能中,對隔離級別有不同的需求。
Mybatis最硬核的API你知道幾個?

SqlSessionFactory一旦被創(chuàng)建就應(yīng)該在 應(yīng)用的運(yùn)行期間 一直存在,沒有任何理由丟棄它或重新創(chuàng)建另一個實(shí)例。 使用 SqlSessionFactory 的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習(xí)慣”。因此 SqlSessionFactory 的最佳作用域是 應(yīng)用作用域 。 最簡單的就是使用單例模式或者靜態(tài)單例模式。

請記住,創(chuàng)建 SqlSessionFactory ,一次就好!

每個數(shù)據(jù)庫對應(yīng)一個 SqlSessionFactory 實(shí)例。SqlSessionFactory 一旦被創(chuàng)建, 它的生命周期應(yīng)該與應(yīng)用的生命周期相同 。所以,如果你想連接兩個數(shù)據(jù)庫,就需要創(chuàng)建兩個 SqlSessionFactory 實(shí)例,每個數(shù)據(jù)庫對應(yīng)一個;而如果是三個數(shù)據(jù)庫,就需要三個實(shí)例,依此類推。

Mybatis最硬核的API你知道幾個?

6、SqlSession – 會話

SqlSession 是一個接口,有兩個實(shí)現(xiàn)類:

  • DefaultSqlSession (默認(rèn)實(shí)現(xiàn))
  • SqlSessionManager (已棄用)

簡單來說,通過會話工廠構(gòu)建出 SqlSession 實(shí)例之后,我們就可以進(jìn)行增刪改查了,默認(rèn)實(shí)例 DefaultSqlSession 提供了如此多的方法供用戶使用,有超過30個:

Mybatis最硬核的API你知道幾個?

sqlSession 的方法除了 CURD,還提供了事務(wù)的控制例如提交/關(guān)閉/回滾等、提供了配置對象的獲取例如 getConfiguration()、提供了批量語句的執(zhí)行更新例如 flushStatements()、提供了緩存清除例如 clearCache() 、提供了映射器的使用 getMapper() 等等。

Mybatis最硬核的API你知道幾個?

對于客戶端應(yīng)用層面來說,熟悉 sqlSession 的 API 基本就可以任意操作數(shù)據(jù)庫了,不過我們希望想進(jìn)一步了解 sqlSession 內(nèi)部是如何執(zhí)行 sql 呢?其實(shí) sqlSession 是 Mybatis 中用于和數(shù)據(jù)庫交互的 頂層類 ,通常將它與本地線程 ThreadLocal 綁定,一個會話使用一個 SqlSession,并且在使用完畢之后進(jìn)行 關(guān)閉 。

之所以稱 SqlSession 為數(shù)據(jù)交互的 頂層類 ,是它其實(shí)沒有完成實(shí)質(zhì)的數(shù)據(jù)庫操作。根據(jù)之前的架構(gòu)設(shè)計流程我們已經(jīng)清晰的知道,SqlSession 對數(shù)據(jù)庫的操作都會轉(zhuǎn)發(fā)給具體的執(zhí)行器 Executor 來完成 ;當(dāng)然執(zhí)行器也是甩手掌柜,執(zhí)行器 Executor 會再分派給語句處理器 StatementHandler ,語句處理器會結(jié)合參數(shù)處理器 ParameterHandler ,共同完成最終的數(shù)據(jù)庫執(zhí)行處理操作(底層還是封裝了 JDBC Statement 操作)。并在每個語句處理器 StatementHandler 處理完成數(shù)據(jù)庫操作之后, 通過結(jié)果結(jié)處理器 ResultSetHandler 以及類型處理器 TypeHandler ,對底層 JDBC 返回的結(jié)果集進(jìn)行映射封裝,最終才返回預(yù)期的封裝對象。

關(guān)注以下圖示 sqlSession 紅色高亮位置,詳細(xì)描述了會話的實(shí)際執(zhí)行路徑:

Mybatis最硬核的API你知道幾個?

SqlSession 可以理解為一次數(shù)據(jù)庫會話,一次會話當(dāng)中既可以執(zhí)行一次 sql ,也允許你批量執(zhí)行多次,但是一旦會話關(guān)閉之后想要再執(zhí)行 sql,那就必須重新創(chuàng)建會話。

Mybatis最硬核的API你知道幾個?

每個線程都應(yīng)該有它自己的 SqlSession 實(shí)例,SqlSession 的實(shí)例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是 請求(request)或方法(method) 作用域。 絕對不能將 SqlSession 實(shí)例的引用放在一個類的靜態(tài)域,甚至一個類的實(shí)例變量也不行。 也絕不能將 SqlSession 實(shí)例的引用放在任何類型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現(xiàn)在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應(yīng)后,就關(guān)閉它。 這個關(guān)閉操作很重要,為了確保每次都能執(zhí)行關(guān)閉操作,你應(yīng)該把這個關(guān)閉操作放到 finally 塊中。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-08-01 11:14:07

開源Api軟件

2024-08-21 08:54:35

2025-03-25 10:49:13

2024-03-01 13:48:00

Git配置系統(tǒng)

2021-11-04 11:54:30

Linux內(nèi)存系統(tǒng)

2021-02-27 17:13:21

前端代碼邏輯

2021-10-12 09:20:02

數(shù)據(jù)庫SQL腳本

2024-01-18 00:16:07

2023-04-27 08:15:09

2020-05-06 14:14:50

Linux依賴軟件

2021-10-14 06:52:47

算法校驗(yàn)碼結(jié)構(gòu)

2023-10-31 08:23:54

網(wǎng)絡(luò)命令Linux

2022-06-04 08:29:27

awk命令BEGIN

2022-04-13 10:05:48

網(wǎng)關(guān)Flowable事件訂閱

2024-04-15 00:04:00

APP開發(fā)

2019-06-03 10:14:07

API網(wǎng)關(guān)微服務(wù)

2023-05-30 14:54:17

Python循環(huán)語句工具

2023-11-26 00:26:00

2024-09-05 14:50:31

2018-04-26 09:03:48

ApacheWeb服務(wù)器
點(diǎn)贊
收藏

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