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