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