描述
本書特色
利用Java的ORM架構----MyBatis,向神人們致敬!
MyBatis有三個主要套件,包括了核心、解析、操作,這些概念完整收錄在本書五大篇26章中。
第一篇從背景開始介紹,初探MyBatis。
第二篇介紹基本功能,包括exceptions、reflection、annotations、lang、type、io、logging、parsing等套件。
第三篇則是解析套件原始程式分析,有解析相關類別及實體類別等。詳盡介紹binding、builder、mapping、scripting、datasource等套件。
第四篇介紹核心操作套件,包括jdbc、cache、transaction、cursor、executor、 session及plugin等套件。
第五篇歸納總結之餘,也有推薦的開放原始碼,等著讀者的挑戰與征服。
優秀的原始程式是最棒的程式設計教材,它能將整個專案完整地呈現給我們,使我們獲得全面的提升。原始程式閱讀能讓我們:
- 透徹地了解專案的實現原理;
- 接觸到成熟和先進的架構方案;
- 學習到可靠與巧妙的實施技巧;
- 發現本身知識盲點,增強本身知識儲備。
因此,原始程式閱讀是軟體開發者提升本身能力極為重要的方法。
作者簡介
易哥
畢業于浙江大學、山東大學。高級軟體系統架構師、網路工程師、資料庫工程師、軟體測試工程師、註冊電氣工程師。
在校成績優異。曾獲得國家獎學金兩次、一等獎學金四次、科技創新大賽一等獎三次,以及五四青年科學獎等。主要科研方向為機器學習、分散式演算法、容錯演算法在無線感測網路中的應用,相關論文獲得lEEE通信協會最佳論文獎。
曾擔任網站技術部門負責人,具有豐富的互聯網開發經驗。先後設計和實現了眾多系統和平臺,也是活躍的開源開發者。
現專注軟體系統架構設計與後端開發,著有《通用源碼閱讀指導書》《高性能架構之道》等書。
目錄
第一篇
背景介紹
01 原始程式碼閱讀
1.1 原始程式閱讀的意義
1.2 原始程式閱讀的方法
1.3 開放原始碼軟體
1.4 MyBatis 原始程式
1.5 本書結構
02 MyBatis 概述
2.1 背景介紹
2.2 快速上手
2.3 MyBatis 的核心功能分析
03 MyBatis 執行初探
3.1 初始化階段追蹤
3.2 資料讀寫階段追蹤
04 MyBatis 原始程式結構概述
4.1 套件結構
4.2 分組結構
第二篇
基礎功能套件原始程式閱讀
05 exceptions 套件
5.1 背景知識
5.2 Exception 類別
5.3 ExceptionFactory 類別
06 reflection 套件
6.1 背景知識
6.2 物件工廠子套件
6.3 執行器子套件
6.4 屬性子套件
6.5 物件包裝器子套件
6.6 反射核心類別
6.7 反射包裝類別
6.8 例外拆裝工具
6.9 參數名稱解析器
6.10 泛型解析器
07 annotations 套件與lang 套件
7.1 Java 註釋詳解
7.2 Param 註釋分析
08 type 套件
8.1 範本模式
8.2 類型處理器
8.3 類型登錄檔
09 io 套件
9.1 背景知識
9.2 VFS 實現類別
9.3 類別檔案的載入
9.4 ResolverUtil 類別
10 logging 套件
10.1 背景知識
10.2 Log 介面
10.3 Log 介面的實現類別
10.4 LogFactory
10.5 JDBC 記錄檔列印
11 parsing 套件
11.1 背景知識
11.2 XML 解析
11.3 文件解析中的變數取代
第三篇
設定解析套件原始程式閱讀
12 設定解析概述
13 binding 套件
13.1 資料庫操作的連線
13.2 抽象方法與資料庫操作節點的連結
13.3 資料庫操作連線歸納
13.4 MyBatis 與Spring、Spring Boot的整合
14 builder 套件
14.1 建造者模式
14.2 建造者基礎類別與工具類別
14.3 SqlSourceBuilder 類別與StaticSqlSource 類別
14.4 CacheRefResolver 類別和ResultMapResolver 類別
14.5 ParameterExpression 類別
14.6 XML 檔案解析
14.7 註釋對映的解析
15 mapping 套件
15.1 SQL 敘述處理功能
15.2 輸出結果處理功能
15.3 輸入參數處理功能
15.4 多資料庫種類處理功能
15.5 其他功能
16 scripting 套件
16.1 OGNL
16.2 語言驅動介面及語言驅動登錄檔
16.3 SQL 節點樹的組建
16.4 SQL 節點樹的解析
16.5 再論SqlSource
17 datasource 套件
17.1 背景知識
17.2 資料來源工廠介面
17.3 JNDI 資料來源工廠
17.4 非池化資料來源及工廠
17.5 池化資料來源
17.6 論資料來源工廠
第四篇
核心操作套件原始程式閱讀
18 jdbc 套件
18.1 AbstractSQL 類別與SQL 類別
18.2 SqlRunner 類別
18.3 ScriptRunner 類別
18.4 jdbc 套件的獨立性
19 cache 套件
19.1 背景知識
19.2 cache 套件結構與Cache 介面
19.3 快取鍵
19.4 快取的實現類別
19.5 快取裝飾器
19.6 快取的組建
19.7 交易快取
19.8 MyBatis 快取機制
20 transaction 套件
20.1 交易概述
20.2 交易介面及工廠
20.3 JDBC 交易
20.4 容器交易
21 cursor 套件
21.1 Iterable 介面與Iterator 介面
21.2 MyBatis 中游標的使用
21.3 游標介面
21.4 預設游標
22 executor 套件
22.1 背景知識
22.2 主鍵自動增加功能
22.3 惰性載入功能
22.4 敘述處理功能
22.5 參數處理功能
22.6 結果處理功能
22.7 結果集處理功能
22.8 執行器
22.9 錯誤上下文
23 session 套件
23.1 SqlSession 及其相關類別
23.2 Configuration 類別
23.3 其他類別
24 plugin 套件
24.1 責任鏈模式
24.2 MyBatis 外掛程式開發
24.3 MyBatis 攔截器平台
24.4 MyBatis 攔截器鏈與攔截點
第五篇
歸納與展望
25 原始程式閱讀歸納
25.1 前期準備
25.2 專案初探
25.3 原始程式閱讀
26 優秀開放原始碼專案推薦
26.1 Guava
26.2 Tomcat
26.3 Redis
26.4 Dubbo
26.5 React
序
前言
有一段時間,我覺得我非要閱讀開放原始碼專案的原始程式不可。那時,我在公司負責設計和開發了很多系統。如果連大學時帶領大家開發和維護學校網站也算上的話,那我進行軟體開發已經整整十年了。在這十年裡,我對自己設計和開發的系統都很有信心,但有一個疑惑一直縈繞在我心頭:我不知道,我的架構和世界最優良架構之間的差距到底有多大。
閱讀開放原始碼專案的原始程式能給我答案。
許多優秀的開放原始碼專案歷經數千名開發者的數萬次提交,被數億使用者使用。這些專案從可擴充性、可靠性和可用性等各個角度考量,都是十分優良的。透過閱讀這些專案的原始程式,我能找到自己在軟體設計和開發上的不足。
於是我開始了我的原始程式閱讀計畫。
在閱讀原始程式的過程中,我看過不少資料。但很多資料對原始程式中簡單的部分說明得細緻入微,而對複雜的部分則避而不談或含糊其辭。在閱讀原始程式的過程中,我也走過不少彎路,經常在一個困難中掙扎很久不能前進。當然,閱讀原始程式也讓我收穫頗豐。它不僅讓我知道了自己的設計與優良設計之間的差距,還讓我學到了許多架構技巧和程式設計知識。
在原始程式閱讀的過程中,我也歸納出了許多經驗和方法。因此,我決定寫這本書,將經驗和方法分享出來,指引許多和我一樣前行在原始程式閱讀道路上的人。原始程式閱讀首先要選定對應的原始程式作為材料。從專案的成熟度、涉及面、應用廣度、專案規模等多方面考慮,本書最後選取MyBatis 原始程式。因此,本書將以閱讀MyBatis 原始程式為例,介紹原始程式閱讀的經驗和方法。
在本書的寫作中,我努力做到詳盡而不囉唆。本書以套件為單位,對MyBatis原始程式中的300 多個類別進行了介紹。在此過程中,對於簡單或重複的類別一筆帶過,但對於複雜的類別,則是逐方法、逐行地進行分析,力求讓大家讀得順、讀得懂、有收穫。
本書分為五篇,各篇主要內容如下。
第一篇為背景介紹,包含第 1 ∼ 4 章。
第1 章介紹了原始程式閱讀的意義和方法。
第2 章對MyBatis 的背景和快速上手方法進行了介紹。這一章的內容是簡單但重要的。對於任何一個軟體,其背景對應於軟體的「設計需求」,其使用對應於軟體的「主要功能」。把握一個軟體的設計需求和主要功能對於閱讀軟體的原始程式很有幫助。
第3 章中使用中斷點偵錯方法對MyBatis 的執行過程進行了追蹤。該章內容有助我們了解整個MyBatis 的內部架構。
第4 章對MyBatis 原始程式結構進行了介紹,並根據原始程式套件的功能對套件進行了分類。
第二篇為基礎功能套件原始程式閱讀,包含第 5 ∼ 11 章。
在這一篇中,我們對基礎功能套件中的原始程式進行了閱讀。基礎功能套件相對獨立,與MyBatis 的核心邏輯耦合小,比較適合作為原始程式閱讀的切入點。在閱讀這些原始程式時,我們也會逐步介紹一些閱讀原始程式常用的方法和技巧。
第5 章介紹了exceptions 套件的原始程式,可以透過該套件了解MyBatis 的整個例外系統。
第6 章介紹了reflection 套件的原始程式。該套件基於反射提供了建立物件、修改物件屬性、呼叫物件方法等功能。這些功能在MyBatis 的參數處理、結果處理等環節都發揮了重要的作用。
第7 章介紹了annotations 套件與lang 套件的原始程式。這兩個套件中全是註釋類別。我們將透過對Java 註釋的學習詳細了解每個註釋類別的含義。最後,我們還透過原始程式分析了註釋類別如何在MyBatis 的執行中發揮作用。
第8 章介紹了type 套件的原始程式。透過這一章將了解MyBatis 如何組織和實現類型處理器,以完成對各種類類型資料的處理。
第9 章介紹了io 套件的原始程式。透過該套件將了解到MyBatis 如何完成外部類別的篩選和載入。
第10 章介紹了logging 套件的原始程式。logging 套件不僅為MyBatis 提供了記錄檔記錄功能,還提供了取得和記錄JDBC 中記錄檔的功能。透過這一章將了解這些功能的實現細節。
第11 章介紹了parsing 套件的原始程式。透過這一章將了解MyBatis 如何完成XML 檔案的解析。
第三篇為設定解析套件原始程式閱讀,包含第 12 ∼ 17 章。
第12 章介紹了設定解析相關類別的分類方法。設定解析相關類別可以按照類別的功能劃分為解析器類別和解析實體類別。
第13 章介紹了binding 套件的原始程式。該套件負責將SQL 敘述連線對映介面。
第14 章介紹了builder 套件的原始程式。該套件中的建造者基礎類別和工具類別為MyBatis 基於建造者模式建造物件提供了基礎。此外,該套件還完成了XML 檔案和註釋對映的解析工作。
第15 章介紹了mapping 套件的原始程式。該套件完成了SQL 敘述的處理、輸入參數的處理、輸出結果的處理等功能,並為MyBatis 提供了多資料庫支援的能力。
第16 章介紹了scripting 套件的原始程式。就是在這個套件中,複雜的SQL 節點被逐步解析為純粹的SQL 敘述,該章將詳細說明這一解析過程。
第17 章介紹了datasource 套件的原始程式。該套件包含了MyBatis 中與資料來源相關的類別,包含非池化資料來源、池化資料來源、資料來源工廠等。也正是透過該套件,MyBatis 完成了和資料庫的對接。
第四篇為核心操作套件原始程式閱讀,包含第 18 ∼ 24 章。
在這一篇中,將詳細介紹MyBatis 的核心操作套件。
第18 章介紹了jdbc 套件的原始程式。該套件僅使用六個類別便為MyBatis 提供了執行SQL 敘述和指令稿的能力。
第19 章介紹了cache 套件的原始程式。該套件向我們展示了MyBatis 如何使用裝飾器模式提供給使用者豐富的、可設定的快取,並且該章還從功能維度出發詳細介紹了MyBatis 的兩級快取機制。
第20 章介紹了transaction 套件的原始程式。該套件為MyBatis 提供了內部和外部的交易支援。
第21 章介紹了cursor 套件的原始程式。透過該套件,MyBatis 能將查詢結果封裝為游標形式傳回。
第22 章介紹了executor 套件的原始程式。executor 套件是MyBatis 中最為重要也是最複雜的套件。在這一章中,首先,以子套件為單位分別介紹了MyBatis 的主鍵自動增加功能、懶載入功能、敘述處理功能、參數處理功能、結果處理功能和結果集處理功能。然後,在此基礎上對MyBatis 中執行器的原始程式進行了閱讀。最後,介紹了MyBatis 中錯誤上下文的原始程式,了解MyBatis 如何及時地保留錯誤發生時的現場環境。
第23 章介紹了session 套件的原始程式。session 套件是一個對外介面套件,是使用者在使用MyBatis 時接觸最多的套件。
第24 章介紹了plugin 套件的原始程式。在該章中我們撰寫了一個外掛程式,然後透過原始程式詳細了解了MyBatis 外掛程式的實現原理及MyBatis 外掛程式平台的架構。
第五篇為歸納與展望,包含第 25、26 章。
第25 章對閱讀MyBatis 原始程式過程中的方法和技巧進行了歸納。
第26 章從專案的成熟度、涉及面、應用廣度和規模等角度綜合考量,為大家推薦了一些優秀的開放原始碼專案。學習完本書後,大家可以從這些專案中挑選一些進行原始程式閱讀。
原始程式閱讀畢竟是一個對知識廣度和深度都有較高要求的工作,為了大家能夠順利地閱讀MyBatis 的原始程式,我們會在很多章節之前先介紹該章節原始程式涉及的基礎知識。掌握這些基礎知識後再閱讀相關原始程式則會輕鬆很多。
受篇幅所限,書中只能列出部分MyBatis 原始程式。我們將完整的帶中文註釋的MyBatis 原始程式整理成了開放原始碼專案,供大家下載與參考,您可至本公司官網https://www.deepmind.com.tw/ 尋找本書並下載原始繁體中文程式碼。另原作者也提供了簡體中文程式碼於github 上,該簡體中文註釋的網址為:https://github.com/yeecode/MyBatisCN。
為了讓大家能更輕鬆地了解和掌握一些相對複雜的基礎知識,本書也準備了許多範例專案。繁體中文程式碼可到本公司官網https://www.deepmind.com.tw/
尋找本書並下載原始程式碼,本書的簡體中文範例程式也可以在github 上下載,網址為:https://github.com/yeecode/MyBatisDemo。
由於時間和水準有限,書中難免會有疏漏之處。您可以透過我的個人首頁與我取得聯繫並進行交流,在那裡也能看到我的最新專案。我的個人首頁網址為:http://yeecode.top。
透過閱讀本書,您將詳細了解MyBatis 中每一個類別的結構、原理和細節。但要注意,這只是我們閱讀本書的額外收穫。掌握原始程式閱讀的方法和技巧,並將這些方法和技巧應用到其他專案的原始程式閱讀工作、系統設計工作、軟體開發工作中,這才是閱讀本書的最後目的。原始程式閱讀是一項過程艱苦而結果可觀的工作。每一個潛心閱讀原始程式的開發者都值得尊敬,也希望本書能夠在您閱讀原始程式的過程中為您提供一些幫助,讓您多一些收穫。
加油!奮鬥路上的你和我。