本文主要大體介紹一下MyBatis的項目結構。引用參考資料《MyBatis技術內幕》html
此外,https://mybatis.org/mybatis-3... MyBatis官方也提供了很不錯的中文文檔。對於使用中有碰到一些問題,能夠參考一下。java
MyBatis在項目模塊劃分仍是很清晰的。各個模塊層次以及具體做用,以下:sql
模塊 | 層次 | 定義 |
---|---|---|
session | 接口層 | 提供給外部使用的接口API |
scripting | 核心處理層 | 解析映射文件中的動態SQL節點。並造成數據庫可執行的SQL語句。 |
mapping | 核心處理層 | 映射 |
builder | 核心處理層 | 配置解析 |
executor | 核心處理層 | 執行器模塊,串聯整個執行流程。 |
plugin | 核心處理層 | 插件模塊:提供插件接口,經過自定義插件方式對MyBatis進行拓展 |
cursor | 核心處理層 | 遊標模塊 |
reflection | 基礎支持層 | 反射模塊:mybatis專門對反射模塊進行封裝。提供更加簡單易用的API |
type | 基礎支持層 | 類型轉換模塊:Mybatis爲簡化配置提供了別名機制。提供java類型與JDBC類型轉換 |
logging | 基礎支持層 | 日誌模塊:主要是集成第三方日誌 |
io | 基礎支持層 | 資源加載模塊:對類加載器進行了封裝。肯定類加載器順序,並提供加載文件,以及其餘資源的功能 |
datasource | 基礎支持層 | 數據源模塊:mybatis自身提供響應的數據源實現,也提供與第三方數據集成的接口。 |
transaction | 基礎支持層 | 事務管理模塊:Mybatis 對數據庫的事務進行了抽象 |
parsing | 基礎支持層 | 解析器模塊:提供兩個功能:1. 對XPath進行封裝 2爲處理動態sql語句中的佔位符提供支持 |
cache | 基礎支持層 | 緩存模塊:提供一級緩存、二級緩存。優化查詢 |
binding | 基礎支持層 | Binding模塊:將自定義的接口與映射配置文件關聯起來。經過調用mapper接口完成數據庫執行。 |
exceptions | 基礎支持層 | 異常處理 |
annotations | 基礎支持層 | 註解模塊 |
jdbc | 其餘 | JDBC模塊 |
lang | 其餘 | Lang模塊 |
總體分爲三層:數據庫
對應reflection
包緩存
Java中的反射雖然功能強大,但對大多數開發人員來講,寫出高質量的反射代碼仍是有必定難度的。MyBatis 中專門提供了 反射模塊,該模塊對Java原生的反射進行了良好的封裝,提供了更加簡潔易用的API, 方便上層使調用,而且對反射操做進行 了一系列優化,例如緩存了類的元數據,提升了反射操做的性能。
對應type
包安全
正如前面示例所示,MyBatis 爲簡化配置文件提供了別名機制,該機制是類型轉換模塊的主要功能之一。 類型轉換模塊的 另-一個功能是實現JDBC類型與Java類型之間的轉換,該功能在爲SQL語句綁定實參以及映射查詢結果集時都會涉及。在爲 SQL語句綁定實參時,會將數據由Java類型轉換成JDBC類型;而在映射結果集時,會將數據由JDBC類型轉換成Java類型。類 型轉換模塊的具體原理在第2章詳述。
對應logging
包session
不管在開發測試環境中,仍是在線上生產環境中,日誌在整個系統中的地位都是很是重要的。良好的日誌功能能夠幫助開發人 員和測試人員快速定位Bug代碼,也能夠幫助運維人員快速定位性能瓶頸等問題。目前的Java世界中存在不少優秀的日誌框 架,例如Log4j、Log4j二、 slf4j 等。MyBatis 做爲-一個設計優良的框架,除了提供詳細的日誌輸出信息,還要可以集 成多種日誌框架,其日誌模塊的一個主要功能就是集成第三方日誌框架。
對應io
包mybatis
資源加載模塊主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載類文件以及其餘資源文件的功能。
對應parsing
包架構
解析器模塊的主要提供了兩個功能:一個功能是對XPath進行封裝,爲MyBatis初始化時解析mybatis- config.xml配置文 件以及映射配置文件提供支持;另外一個功能是爲處理動態SQL語句中的佔位符提供支持。
對應datasource
包app
數據源是實際開發中經常使用的組件之一。 如今開源的數據源都提供了比較豐富的功能,例如,鏈接池功能、檢測鏈接狀態等, 選擇性能優秀的數據源組件對於提高ORM框架乃至整個應用的性能都是很是重要的。MyBatis 自身提供了相應的數據源實 現,固然MyBatis也提供了與第三方數據源集成的接口,這些功能都位於數據源模塊之中。
對應transaction
包
MyBatis對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。在不少場景中,MyBatis 會與Spring 框架集成,並由Spring框架管理事務
對應cache
包
在優化系統性能時,優化數據庫性能是很是重要的一個環節,而添加緩存則是優化數據庫時最有效的手段之一。正確、合理地 使用緩存能夠將一部分數據庫請求攔截在緩存這一層。MyBatis 中提供了一 級緩存和二級緩存,而這兩級緩存都是依賴於基 礎支持層中的緩存模塊實現的。這裏須要讀者注意的是,MyBatis中自帶的這兩級緩存與MyBatis 以及整個應用是運行在同 一個JVM中的,共享同一塊堆內存。若是這兩級緩存中的數據量較大,則可能影響系統中其餘功能的運行,因此當須要緩存大 量數據時,優先考慮使用Redis、Memcache 等緩存產品。
對應binding
包
經過前面的示例咱們知道,在調用SqlSession相應方法執行數據庫操做時,須要指定映射文件中定義的SQL節點,若是出現 拼寫錯誤,咱們只能在運行時才能發現相應的異常。爲了儘早發現這種錯誤,MyBatis 經過Binding模塊將用戶自定義的 Mapper接口與映射配置文件關聯起來,系統能夠經過調用自定義Mapper接口中的方法執行相應的SQL語句完成數據庫操做, 從而避免上述問題。值得讀者注意的是,開發人員無須編寫自定義Mapper接口的實現,MyBatis 會自動爲其建立動態代理對 象。在有些場景中,自定義Mapper接口能夠徹底代替映射配置文件,但有的映射規則和SQL語句的定義仍是寫在映射配置文件 中比較方便,例如動態SQL語句的定義。
對應annotation
包
隨着 Java 註解的慢慢流行,MyBatis 提供了註解的方式,使得咱們方便的在 Mapper 接口上編寫簡單的數據庫 SQL 操做代碼,而無需像以前同樣,必須編寫 SQL 在 XML 格式的 Mapper 文件中。雖說,實際場景下,你們仍是喜歡在 XML 格式的 Mapper 文件中編寫響應的 SQL 操做。
對應 exceptions
包
定義了 MyBatis 專有的 PersistenceException 和 TooManyResultsException 異常,此外還包ExceptionFactory異常工廠。
對應executor
包
在MyBatis初始化過程當中,會加載mybatis config.xml配置文件、映射配置文件以及Mapper接口中的註解信息,解析後 的配置信息會造成相應的對象並保存到Configuration對象中。例如,示例中定義的<resultMap>節點(即ResultSet的映 射規則)會被解析成ResultMap對象;示例中定義的<result>節點(即屬性映射)會被解析成ResultMapping對象。以後,利 用該Configuration對象建立SqlSessionFactory對象。待MyBatis 初始化以後,開發人員能夠經過初始化獲得 SqlSessionFactory 建立SqlSession對象並完成數據庫操做。
對應executor
scripting
包
拼湊SQL語句是一件煩瑣且易出錯的過程,爲了將開發人員從這項枯燥無趣的工做中解脫出來,MyBatis實現動態SQL語句的 功能,提供了多種動態SQL語句對應的節點,例如,<where>節點、 <if>節點、 <foreach> 節點等。經過這些節點的組合 使用,開發人員能夠寫出幾乎知足全部需求的動態SQL語句。MyBatis中的scripting模塊會根據用戶傳入的實參,解析映射 文件中定義的動態SQL節點,並造成數據庫可執行的SQL語句。以後會處理SQL語句中的佔位符,綁定用戶傳入的實參。
對應executor
包
SQL語句的執行涉及多個組件,其中比較重要的是Executor 、StatementHandler 、ParameterHandler和 ResultSetHandler. Executor 主要負責維護- - 級緩存和二級緩存,並提供事務管理的相關操做,它會將數據庫相關 操做委託給StatementHandler完成。StatementHandler首先經過ParameterHandler 完成SQL語句的實參綁定,而後 經過java. sql.Statement對象執行SQL語句並獲得結果集,最後經過ResultSetHandler完成結果集的映射,獲得結果 對象並返回。
對應plugin
包
Mybatis 自身的功能雖然強大,可是並不能完美切合全部的應用場景,所以MyBatis提供了插件接口,咱們能夠經過添加用 戶自定義插件的方式對MyBatis進行擴展。用戶自定義插件也能夠改變Mybatis的默認行爲,例如,咱們能夠攔截SQL語句並 對其進行重寫。因爲用戶自定義插件會影響MyBatis的核心行爲,在使用自定義插件以前,開發人員須要瞭解MyBatis內部的 原理,這樣才能編寫出安全、高效的插件。
對應session
包
接口層相對簡單,其核心是SqlSession 接口,該接口中定義了MyBatis 暴露給應用程序調用的API,也就是上層應用與 MyBatis交互的橋樑。接口層在接收到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操做。
對應 jdbc
包
JDBC單元測試支持類。【只能說是個測試掛件,白送都不要的那種,隨便看看得了 】
裏面只包含兩個註解【從調用上好像沒有任何類用到這個。不知道幹啥用的!!原諒個人無知。】
總體來講,MyBatis的代碼結構仍是比較簡單易懂的。而且分包也比較清晰,見名知意。下面就是MyBatis的總體架構圖