本書從MyBatis源碼的角度分析Mapper綁定過程、SqlSession操作數據庫原理、插件實現原理等,同時介紹一些MyBatis的高級用法,并挖掘MyBatis源碼中使用的設計模式。 本書共13章,分為MyBatis 3源碼篇和MyBatis Spring源碼篇。第1~11章介紹MyBatis核心源碼,從源碼的角度分析MyBatis的實現原理,并介紹一些MyBatis的高級用法。MyBatis大多數情況下會與Spring整合使用,第12~13章介紹MyBatis Spring的實現原理,并分析MyBatis Spring模塊的核心代碼。 本書適合掌握了MyBatis的基本用法并希望了解MyBatis底層實現的Java開發(fā)人員、架構師以及對Java開源項目感興趣的讀者閱讀。
本書從MyBatis源碼的角度分析了Mapper綁定過程、SqlSession操作數據庫原理、插件實現原理等,同時介紹一些MyBatis的高級應用,挖掘MyBatis源碼中使用的設計模式。本書適合希望
了解MyBatis底層實現的Java開發(fā)人員、架構師以及對Java開源項目感興趣的所有讀者閱讀參考。
前 言
在寫作本書時,SSM(Spring、Spring MVC和MyBatis)框架已經成為很多互聯網公司的標配。筆者最早接觸MyBatis框架是在2014年,當時接手的是一個非常成熟的網上銀行系統,項目中使用的持久層框架就是MyBatis的前身iBatis框架。后來換了兩份工作,新的公司也都選擇MyBatis作為持久層框架。從iBatis過渡到MyBatis框架幾乎不需要任何學習成本,MyBatis延續(xù)了iBatis簡單易用的特點,優(yōu)化了SQL配置方式,引用OGNL表達式來支持動態(tài)SQL配置,使得動態(tài)SQL配置更加優(yōu)雅,而且更容易理解。在筆者看來,MyBatis相對于iBatis框架最大的創(chuàng)新是引入了SQL Mapper的概念。我們可以將XML文件中的SQL配置與一個Java接口進行綁定,SQL配置的命名空間對應Java接口的完全限定名,而具體的每個SQL語句的配置對應Java接口中的一個方法,建立綁定后,可以通過調用Java接口中定義的方法來執(zhí)行XML文件中配置的SQL語句。
MyBatis作為持久層框架,以其小巧輕便、SQL可配置、使用簡單等特點深受廣大Java開發(fā)者喜愛。然而大多數開發(fā)人員對MyBatis框架的理解僅局限于使用,并不理解框架底層的實現原理。作為一名開發(fā)人員,閱讀開源框架的源碼,可以學習源碼中對設計模式及面向對象設計原則的應用,有助于提升自身編碼能力。筆者在工作之余,深入研究了MyBatis框架的源碼,本書將會從源碼的角度分析MyBatis框架各個特性的實現原理。
閱讀準備
在閱讀本書之前,讀者需要準備如下開發(fā)環(huán)境:
? JDK1.8或以上版本
? Apache Maven構建工具
? IntelliJ IDEA 開發(fā)工具
? Git版本控制工具
內容概要
本書主要分為兩篇:第1篇為MyBatis 3源碼篇(第1~11章),主要介紹MyBatis框架各個特性的源碼實現;第2篇章為MyBatis Spring源碼篇(第12~13章),主要介紹MyBatis框架與Spring框架整合的原理及MyBatis Spring模塊的實現細節(jié)。下面是本書的內容大綱。
第1章 搭建MyBatis源碼環(huán)境
主要介紹如何搭建MyBatis源碼調試環(huán)境,包括MyBatis框架源碼獲取途徑、如何導入集成開發(fā)工具以及如何運行MyBatis源碼中的測試用例。
第2章 JDBC規(guī)范詳解
MyBatis框架是對JDBC輕量級的封裝,熟練掌握JDBC規(guī)范有助于理解MyBatis框架實現原理。本章將詳細介紹JDBC規(guī)范相關細節(jié),已經全面掌握JDBC規(guī)范的讀者可以跳過該章。
第3章 MyBatis常用工具類
介紹MyBatis框架中常用的工具類,避免讀者因對這些工具類的使用不熟悉而導致對框架主流程理解的干擾,這些工具類包括MetaObject、ObjectFactory、ProxyFactory等。
第4章 MyBatis核心組件介紹
介紹MyBatis的核心組件,包括Configuration、SqlSession、Executor、MappedStatement等,包括這些組件的作用及MyBatis執(zhí)行SQL語句的核心流程。
第5章 SqlSession的創(chuàng)建過程
主要介紹SqlSession組件的創(chuàng)建過程,包括MyBatis框架對XPath方式解析XML封裝的工具類、MyBatis主配置文件解析生成Configuration對象的過程。
第6章 SqlSession執(zhí)行Mapper過程
本章介紹Mapper接口注冊的過程、SQL配置轉換為MappedStatement對象并注冊到Configuration對象的過程。除此之外,本章還將介紹SqlSession對象執(zhí)行Mapper的過程。
第7章 MyBatis緩存
本章首先介紹MyBatis一級緩存和二級緩存的使用細節(jié),接著介紹一級緩存和二級緩存的實現原理,最后介紹MyBatis如何整合Redis作為二級緩存。
第8章 MyBatis日志實現
基于Java語言的日志框架比較多,比較常用的有Logback、Log4j等,本章介紹Java的日志框架發(fā)展史,并介紹這些日志框架之間的關系,最后介紹MyBatis自動查找日志框架的實現原理。
第9章 動態(tài)SQL實現原理
本章主要介紹MyBatis動態(tài)SQL的使用、動態(tài)SQL配置轉換為SqlSource對象的過程以及動態(tài)SQL的解析原理,最后從源碼的角度分析動態(tài)SQL配置中#{}和${}參數占位符的區(qū)別。
第10章 MyBatis插件原理及應用
本章介紹MyBatis插件的實現原理,并以實際的案例介紹如何自定義MyBatis插件。在本章中將會實現兩個MyBatis插件,分別為分頁查詢插件和慢SQL統計插件。
第11章 MyBatis級聯映射與懶加載
本章介紹MyBatis中一對一、一對多級聯映射和懶加載機制的使用細節(jié),并介紹級聯映射和懶加載的源碼實現。
第12章 MyBatis與Spring整合案例
在介紹MyBatis框架與Spring整合原理之前,需要了解MyBatis整合Spring的基本配置,本章以一個用戶注冊RESTful接口案例作為MyBatis框架與Spring框架整合的最佳實踐。
第13章 MyBatis Spring的實現原理
首先介紹Spring框架中的一些核心概念和Spring IoC容器的啟動過程,接著介紹MyBatis和Spring整合后動態(tài)代理產生的Mapper對象是如何與Spring Ioc容器進行關聯的,最后介紹MyBatis整合Spring事務管理的實現原理。
隨書源碼
本書相關源碼托管在Github上,讀者可以從Github倉庫獲取隨書源碼。
源碼地址:https://github.com/rongbo-j/mybatis-book。
圖書勘誤
由于個人能力有限,書中可能有表述不到位或者對知識點理解欠妥的地方,歡迎讀者批評指正。若有任何疑問,均可以在隨書源碼Github倉庫上提交。
勘誤地址:https://github.com/rongbo-j/mybatis-book/issues。
致謝
本書從寫作到完稿用了一年多時間,這個過程對于筆者來說是一個極大的考驗。作為一名程序員,只有不斷地提升,才會覺得充實。把大量的時間用在寫作上,時常會因為沒有攝入新知識而恐慌,感謝在本書寫作過程中家人對我精神上的支持。另外,特別感謝夏毓彥老師和清華大學出版社的工作人員,有你們的幫助才有本書的順利出版。
著 者
2019年5月
江榮波,JAVA高級工程師,參與過網上銀行、短信平臺、渠道整合平臺開發(fā)等大型Java EE項目及多款金融類App產品開發(fā)。出版圖書《AngularJS入門與進階》。
目 錄
第1篇 MyBatis 3源碼
第1章 搭建MyBatis源碼環(huán)境 3
1.1 MYBATIS 3簡介 3
1.2 環(huán)境準備 4
1.3 獲取MYBATIS源碼 4
1.4 導入MYBATIS源碼到IDE 6
1.5 HSQLDB數據庫簡介 9
1.6 本章小結 11
第2章 JDBC規(guī)范詳解 13
2.1 JDBC API簡介 13
2.1.1 建立數據源連接 14
2.1.2 執(zhí)行SQL語句 15
2.1.3 處理SQL執(zhí)行結果 16
2.1.4 使用JDBC操作數據庫 16
2.2 JDBC API中的類與接口 17
2.2.1 java.sql包詳解 17
2.2.2 javax.sql包詳解 20
2.3 CONNECTION詳解 24
2.3.1 JDBC驅動類型 24
2.3.2 java.sql.Driver接口 26
2.3.3 Java SPI機制簡介 27
2.3.4 java.sql.DriverAction接口 29
2.3.5 java.sql.DriverManager類 29
2.3.6 javax.sql.DataSource接口 31
2.3.7 使用JNDI API增強應用的可移植性 32
2.3.8 關閉Connection對象 34
2.4 STATEMENT詳解 35
2.4.1 java.sql.Statement接口 35
2.4.2 java.sql.PreparedStatement接口 39
2.4.3 java.sql.CallableStatement接口 43
2.4.4 獲取自增長的鍵值 44
2.5 RESULTSET詳解 45
2.5.1 ResultSet類型 45
2.5.2 ResultSet并行性 46
2.5.3 ResultSet可保持性 46
2.5.4 ResultSet屬性設置 47
2.5.5 ResultSet游標移動 47
2.5.6 修改ResultSet對象 48
2.5.7 關閉ResultSet對象 50
2.6 DATABASEMETADATA詳解 51
2.6.1 創(chuàng)建DatabaseMetaData對象 51
2.6.2 獲取數據源的基本信息 51
2.6.3 獲取數據源支持特性 53
2.6.4 獲取數據源限制 53
2.6.5 獲取SQL對象及屬性 54
2.6.6 獲取事務支持 54
2.7 JDBC事務 54
2.7.1 事務邊界與自動提交 55
2.7.2 事務隔離級別 55
2.7.3 事務中的保存點 56
2.8 本章小結 57
第3章 MyBatis常用工具類 58
3.1 使用SQL類生成語句 58
3.2 使用SCRIPTRUNNER執(zhí)行腳本 64
3.3 使用SQLRUNNER操作數據庫 67
3.4 METAOBJECT詳解 71
3.5 METACLASS詳解 72
3.6 OBJECTFACTORY詳解 73
3.7 PROXYFACTORY詳解 74
3.8 本章小結 75
第4章 MyBatis核心組件介紹 76
4.1 使用MYBATIS操作數據庫 76
4.2 MYBATIS核心組件 80
4.3 CONFIGURATION詳解 82
4.4 EXECUTOR詳解 88
4.5 MAPPEDSTATEMENT詳解 90
4.6 STATEMENTHANDLER詳解 92
4.7 TYPEHANDLER詳解 94
4.8 PARAMETERHANDLER詳解 97
4.9 RESULTSETHANDLER詳解 98
4.10 本章小結 100
第5章 SqlSession的創(chuàng)建過程 101
5.1 XPATH方式解析XML文件 101
5.2 CONFIGURATION實例創(chuàng)建過程 104
5.3 SQLSESSION實例創(chuàng)建過程 108
5.4 本章小結 109
第6章 SqlSession執(zhí)行Mapper過程 110
6.1 MAPPER接口的注冊過程 110
6.2 MAPPEDSTATEMENT注冊過程 114
6.3 MAPPER方法調用過程詳解 119
6.4 SQLSESSION執(zhí)行MAPPER過程 126
6.5 本章小結 130
第7章 MyBatis緩存 131
7.1 MYBATIS緩存的使用 131
7.2 MYBATIS緩存實現類 132
7.3 MYBATIS一級緩存實現原理 135
7.4 MYBATIS二級緩存實現原理 138
7.5 MYBATIS使用REDIS緩存 142
7.6 本章小結 145
第8章 MyBatis日志實現 146
8.1 JAVA日志體系 146
8.2 MYBATIS日志實現 149
8.3 本章小結 155
第9章 動態(tài)SQL實現原理 156
9.1 動態(tài)SQL的使用 156
9.2 SQLSOURCE與BOUNDSQL詳解 159
9.3 LANGUAGEDRIVER詳解 161
9.4 SQLNODE詳解 164
9.5 動態(tài)SQL解析過程 169
9.6 從源碼角度分析#{}和${}的區(qū)別 179
9.7 本章小結 182
第10章 MyBatis插件原理及應用 184
10.1 MYBATIS插件實現原理 184
10.2 自定義一個分頁插件 193
10.3 自定義慢SQL統計插件 198
10.4 本章小結 200
第11章 MyBatis級聯映射與懶加載 201
11.1 MYBATIS級聯映射詳解 201
11.1.1 準備工作 201
11.1.2 一對多關聯映射 205
11.1.3 一對一關聯映射 206
11.1.4 Discriminator詳解 209
11.2 MYBATIS懶加載機制 210
11.3 MYBATIS級聯映射實現原理 212
11.3.1 ResultMap詳解 212
11.3.2 ResultMap解析過程 213
11.3.3 級聯映射實現原理 218
11.4 懶加載實現原理 225
11.5 本章小結 230
第2篇 MyBatis Spring源碼
第12章 MyBatis與Spring整合案例 233
12.1 準備工作 233
12.2 MYBATIS與SPRING整合 234
12.3 用戶注冊案例 236
12.4 本章小結 239
第13章 MyBatis Spring的實現原理 240
13.1 SPRING中的一些概念 240
13.2 SPRING容器啟動過程 243
13.3 MAPPER動態(tài)代理對象注冊過程 244
13.4 MYBATIS整合SPRING事務管理 248
13.5 本章小結 253