對於原始碼,很多人不知道如何看,今天來教教大家如何看原始碼。前提是我們需要對整個Mybatis的原理、工作流程和模組進行一個整體的直知曉,另外還要有使用經驗。
本文主要內容:
原始碼下載
如何下載原始碼?
進入官網
https://mybatis。org/mybatis-3/zh/index。html
方法一
跳轉到github上,我們可以在github上下原始碼
https://github。com/mybatis/mybatis-3
下載原始碼
方法二
也可以透過
https://github。com/mybatis/mybatis-3/releases
下載對應版本jar和原始碼:
下載到本地後,解壓到自己的本地目錄,然後使用eclipse或者IDEA匯入。
發現Mybatis的包目錄多達20個,下面我們就來說說這些包的關係和對應的作用。
包分成三大類
基礎功能包
這些包用來為其他包提供一些外圍基礎功能,如檔案讀取功能、反射操作功能等。這些包的特點是功能相對獨立,與業務邏輯耦合小。
下面就是基礎功能相關的包目錄:
配置解析包
這些包用來完成配置解析、儲存等工作。這些包中的方法主要在系統初始化階段執行。
下面就是配置相關的包目錄:
核心操作包
這些包用來完成資料庫操作。在工作過程中,這些包可能會依賴基礎功能包提供的基礎功能和配置解析包提供的配置資訊。這些包中的方法主要在資料庫操作階段執行。
核心處理層主要做了這四件事:
把介面中傳入的引數解析並對映成JDBC型別;
解析xml檔案中的SQL語句,包括插入引數和動態SQL的生成;
執行SQL語句;
處理結果集,並對映成Java物件。
注意:外掛也屬於核心層,這是由它的工作方式和攔截的物件決定的。
下面就是核心層對應的包目錄:
具體包介紹
reflection 包
Java 中的反射雖然功能強大,但對大多數開發人員來說,寫出高質量的反射程式碼還是 有一定難度的。
MyBatis 中專門提供了反射模組,該模組對 Java 原生的反射進行了良好的封裝,提了更加簡潔易用的 API,方便上層呼叫,並且對反射操作進行了一系列最佳化,例如快取了類的元資料,提高了反射操作的效能。
Java反射機制主要提供了以下功能。· 在執行時判斷任意一個物件所屬的類;· 在執行時構造任意一個類的物件;· 在執行時修改任意一個物件的成員變數;· 在執行時呼叫任意一個物件的方法。
推薦一篇反射的文章:
type 包
MyBatis 為簡化配置檔案提供了
別名機制
,該機制是型別轉換模組的主要功能之一。
型別轉換模組的另一個功能是實現 JDBC 型別與 Java 型別之間的轉換,該功能在為 SQL 語句繫結實參以及對映查詢結果集時都會涉及:
在為 SQL 語句繫結實參時,會將資料由 Java 型別轉換成 JDBC 型別。
而在對映結果集時,會將資料由 JDBC 型別轉換成 Java 型別。
logging 包
無論在開發測試環境中,還是在線上生產環境中,日誌在整個系統中的地位都是非常重要的。良好的日誌功能可以幫助開發人員和測試人員快速定位 Bug 程式碼,也可以幫助運維人員快速定位效能瓶頸等問題。目前的 Java 世界中存在很多優秀的日誌框架,例如 Log4j、 Log4j2、Slf4j 等。
MyBatis 作為一個設計優良的框架,除了提供詳細的日誌輸出資訊,還要能夠整合多種日誌框架,其日誌模組的一個主要功能就是
整合第三方日誌框架
。
io 包
資源載入模組,主要是對類載入器進行封裝,確定類載入器的使用順序,並提供了載入類檔案以及其他資原始檔的功能 。
parsing 包
顧名思義解析器模組,主要提供了兩個功能:
一個功能,是對 XPath進行封裝,為 MyBatis 初始化時解析 mybatis-config。xml 配置檔案以及對映配置檔案提供支援。
另一個功能,是為處理動態 SQL 語句中的佔位符提供支援。
datasource 包
資料來源是實際開發中常用的元件之一。現在開源的資料來源都提供了比較豐富的功能,例如,連線池功能、檢測連線狀態等,選擇效能優秀的資料來源元件對於提升 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 語句的定義。
annotations 包
隨著 Java 註解的慢慢流行,MyBatis 提供了
註解
的方式,使得我們方便的在 Mapper 介面上編寫簡單的資料庫 SQL 操作程式碼,而無需像之前一樣,必須編寫 SQL 在 XML 格式的 Mapper 檔案中。雖然說,實際場景下,大家還是喜歡在 XML 格式的 Mapper 檔案中編寫相應的 SQL 操作。
exceptions 包
exceptions包中有三個與Exception相關的類:
IbatisException類(已經設定為不推薦使用了)、
PersistenceException類
TooManyResultsException類
在 MyBatis的其他包中,還有許多異常類。這些異常類中除 RuntimeSqlException類外,均為 PersistenceException的子類。
MyBatis中異常類類圖:
幾乎每個都有閾值對應的自定義異常。
scripting 包
拼湊 SQL 語句是一件繁瑣且易出錯的過程,為了將開發人員從這項枯燥無趣的工作中 解脫出來,MyBatis 實現
動態 SQL 語句
的功能,提供了多種動態 SQL語句對應的節點。例如 節點、 節點、 節點等 。透過這些節點的組合使用, 開發人 員可以寫出幾乎滿足所有需求的動態 SQL 語句。
MyBatis 中的 scripting 模組,會根據使用者傳入的實參,解析對映檔案中定義的動態 SQL 節點,並形成資料庫可執行的 SQL 語句。之後會處理 SQL 語句中的佔位符,繫結使用者傳入的實參。
plugin 包
Mybatis 自身的功能雖然強大,但是並不能完美切合所有的應用場景,因此 MyBatis 提供了外掛介面,我們可以透過新增使用者自定義外掛的方式對 MyBatis 進行擴充套件。使用者自定義外掛也可以改變 Mybatis 的預設行為,例如,我們可以攔截 SQL 語句並對其進行重寫。
由於使用者自定義外掛會影響 MyBatis 的核心行為,在使用自定義外掛之前,開發人員需要了解 MyBatis 內部的原理,這樣才能編寫出安全、高效的外掛。
session 包
介面層相對簡單,其核心是 SqlSession 介面,該介面中定義了 MyBatis 暴露給應用程式呼叫的 API,也就是上層應用與 MyBatis 互動的橋樑。介面層在接收到呼叫請求時,會呼叫核心處理層的相應模組來完成具體的資料庫操作。
executor包
主要負責維護一級快取和二級快取,並提供事務管理的相關操作,它會將資料庫相關操作委託給 StatementHandler完成。
mapping包
mapping主要是SQL操作解析後的對映
builder包
builder是配置和註解的解析過程。
cursor包
處理遊標相關的程式碼。實話實說,工作中用到很少,所以這裡就不展開介紹。
jdbc 包
生成JDBC能處理的語句 。
lang包
指定使用Java7還是Java8的API的註解。
總結
面對如何看原始碼,很多人都無從下手,有的人也是瞎搞,到最後肯定看一點點就放棄了。
對於看原始碼的套路,個人建議:
1。學會使用,必須要熟練使用;
2。先掌握一些常見的設計模式(工廠模式、單列模式、模板方法模式、裝飾器模式、代理模式等);
3。熟悉設計原理;
4。熟悉原始碼的這個包目錄,以及每個包的大致功能;
5。多思考為什麼是這樣;
6。王者模式:既然你會用了,那麼如果讓你來設計,你會怎麼設計?