Spring依賴注入
常見java開發中,程式員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類執行個體的方法,這種開發存在的問題是new的類執行個體不好統一管理,spring提出了依賴注入的思想,即依賴類不由程式員執行個體化,而是通過spring容器幫我們new指定執行個體并且将執行個體注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉”,通俗的了解是:平常我們new一個執行個體,這個執行個體的控制權是我們程式員,而控制反轉是指new執行個體工作不由我們程式員來做而是交給spring容器來做。
正文
MyBatis 的整體架構分為三層, 分别是基礎支援層、核心處理層和接口層,如下圖所示。
基礎支援層
反射子產品
該子產品對 Java 原生的反射進行了良好的封裝,提供了更加簡潔易用的 API ,友善上層使調用,并且對反射操作進行了一系列優化,例如緩存了類的中繼資料,提高了反射操作的性能。
類型轉換子產品
類型轉換子產品提供了兩個主要功能,一個功能是别名機制,MyBatis 為了簡化配置檔案提供了别名機制;另一個功能是實作 JDBC 類型與 Java 類型之間的轉換,該功能在為 SQL 語句綁定實參以及映射查詢結果集時都會涉及。
日志子產品
提供詳細的日志輸出資訊,并且能夠內建多種日志架構,其日志子產品的一個主要功能就是內建第三方日志架構。
資源加載子產品
資源加載子產品主要是對類加載器進行封裝,确定類加載器的使用順序,并提供了加載類檔案以及其他資源檔案的功能。
解析器子產品
解析器子產品主要提供兩個功能,一個功能是對 XPath 進行封裝,為 MyBatis 初始化時解析 mybatis-config.xml 配置檔案以及映射配置檔案提供支援;另一個功能是為處理動态 SQL 語句中的占位符提供支援。
資料源子產品
MyBatis 自身提供了相應的資料源實作,也提供了與第三方資料源內建的接口。
事務管理
MyBatis 對資料庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實作。一般在應用中,MyBatis 會與 Spring 架構內建,并由 Spring 架構管理事務。
緩存子產品
MyBatis 中提供了一級緩存和二級緩存,而這兩級緩存都是依賴于基礎支援層中的緩存子產品實作的。MyBatis 中自帶的這兩級緩存與 MyBatis 以及整個應用是運作在同一個 JVM 中的,共享同一塊堆記憶體。如果這兩級緩存中的資料量較大, 則可能影響系統中其他功能的運作,是以當需要緩存大量資料時,優先考慮使用 Redis 、Memcache 等緩存産品。
Binding 子產品
在調用 SqlSession 相應方法執行資料庫操作時,需要指定映射檔案中定義的 SQL 節點,如果出現拼寫錯誤,我們隻能在運作時才能發現相應的異常。為了盡早發現這種錯誤,MyBatis 通過 Binding 子產品将使用者自定義的 Mapper 接口與映射配置檔案關聯起來,系統可以通過調用自定義 Mapper 接口中的方法執行相應的SQL 語句完成資料庫操作,進而避免上述問題。
需要注意的是,開發人員無須編寫自定義 Mapper 接口的實作,MyBatis 會自動為其建立動态代理對象。
核心處理層
在核心處理層中實作了 MyBatis 的核心處理流程,其中包括 MyBatis 的初始化以及完成一次資料庫操作涉及的全部流程。
配置解析
在 MyBatis 初始化過程中,會加載 mybatis-config.xml 配置檔案、映射配置檔案以及 Mapper 接口中的注解資訊,解析後的配置資訊會形成相應的對象并儲存到 Configuration 對象中。之後,利用該 Configuration 對象建立 SqlSessionFactory 對象。待 MyBatis 初始化之後,開發人員可以通過初始化得到 SqlSessionFactory 建立 SqlSession 對象并完成資料庫操作。
SOL 解析與 scripting 子產品
拼湊 SQL 語句是一件煩瑣且易出錯的過程,為了将開發人員從這項枯燥無趣的工作中解脫出來,MyBatis 實作動态 SQL 語句的功能,提供了多種動态 SQL 語句對應的節點,例如, 節點、 節點、 節點等。通過這些節點的組合使用,開發人員可以寫出幾乎滿足所有需求的動态 SQL 語句。
MyBatis 中的 scripting 子產品會根據使用者傳入的實參,解析映射檔案中定義的動态 SQL 節點,并形成資料庫可執行的 SQL 語句。之後會處理 SQL 語句中的占位符,綁定使用者傳入的實參。
SQL 執行
SQL 語句的執行涉及多個元件,其中比較重要的是 Executor 、StatementHandler 、ParameterHandler 和 ResultSetHandler。Executor 主要負責維護一級緩存和二級緩存,并提供事務管理的相關操作,它會将資料庫相關操作委托給 StatementHandler 完成。StatementHandler 首先通過 ParameterHandler 完成 SQL 語句的實參綁定;然後通過 java.sql.Statement 對象執行 SQL 語句并得到結果集;最後通過 ResultSetHandler 完成結果集的映射,得到結果對象并傳回。
插件
使用者可以通過添加自定義插件的方式對 MyBatis 進行擴充。使用者自定義插件也可以改變 MyBatis 的預設行為,例如,我們可以攔截 SQL 語句并對其進行重寫。由于使用者自定義插件會影響 MyBatis 的核心行為,在使用自定義插件之前,開發人員需要了解 MyBatis 内部的原理,這樣才能編寫出安全、高效的插件。
下圖展示了 MyBatis 執行一條 SQL 語句的大緻過程。
接口層
接口層相對簡單,其核心是 SqlSession 接口,該接口中定義了 MyBatis 暴露給應用程式調用的 API,也就是上層應用與 MyBatis 互動的橋梁。接口層在接收到調用請求時,會調用核心處理層的相應子產品來完成具體的資料庫操作。
可以通過 MyBatis 源碼的目錄結構檢視各個子產品的具體實作,目錄結構如下圖所示。
封裝的很清晰,基本是一個子產品一個 package。
最後
針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經。希望可以幫助到大家。
最新整理面試題
上述的面試題答案都整理成文檔筆記。
也還整理了一些面試資料&最新2021收集的一些大廠的面試真題,有需要的可以點選這裡,免費擷取
最新整理電子書
最新整理大廠面試文檔
電子書
[外鍊圖檔轉存中…(img-jdTH8dGN-1621309815348)]
最新整理大廠面試文檔
[外鍊圖檔轉存中…(img-5D8uxxxM-1621309815349)]
以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援。