《MyBatis從入門(mén)到精通》中從一個(gè)簡(jiǎn)單的MyBatis查詢?nèi)胧郑罱ㄆ饘W(xué)習(xí)MyBatis的基礎(chǔ)開(kāi)發(fā)環(huán)境。通過(guò)全面的示例代碼和測(cè)試講解了在MyBatis XML方式和注解方式中進(jìn)行增、刪、改、查操作的基本用法,介紹了動(dòng)態(tài)SQL在不同方面的應(yīng)用以及在使用過(guò)程中的zui佳實(shí)踐方案。針對(duì)MyBatis高級(jí)映射、存儲(chǔ)過(guò)程和類型處理器提供了豐富的示例,通過(guò)自下而上的方法使讀者更好地理解和掌握MyBatis的高級(jí)用法,同時(shí)針對(duì)MyBatis的代碼生成器提供了詳細(xì)的配置介紹。此外,《MyBatis從入門(mén)到精通》還提供了緩存配置、插件開(kāi)發(fā)、Spring、Spring Boot集成的詳細(xì)內(nèi)容。zui后通過(guò)介紹Git和GitHub讓讀者了解MyBatis開(kāi)源項(xiàng)目,通過(guò)對(duì)MyBatis源碼和測(cè)試用例的講解讓讀者更好掌握MyBatis。
自2013年起,我開(kāi)始帶領(lǐng)團(tuán)隊(duì)開(kāi)發(fā)項(xiàng)目,公司此前使用的是一套深度集成的Spring、Struts和Hibernate框架,這套重量級(jí)框架顯然已經(jīng)不適合用在全新的項(xiàng)目中。當(dāng)時(shí)使用的Hibernate還是較早的版本,在項(xiàng)目的業(yè)務(wù)層需要拼接大量的SQL和HQL才能進(jìn)行數(shù)據(jù)庫(kù)操作。綜合多方面因素,我決定選擇其他持久化框架進(jìn)行項(xiàng)目開(kāi)發(fā)。因?yàn)镸yBatisSQL和代碼分離的方式以及動(dòng)態(tài)SQL的強(qiáng)大功能,加之其在對(duì)查詢結(jié)果進(jìn)行映射處理等方面具有顯著優(yōu)點(diǎn),因此,我與MyBatis開(kāi)始結(jié)緣。
為了提高查詢效率,通常會(huì)采用物理分頁(yè),然而MyBatis只能支持內(nèi)存分頁(yè)。若想讓MyBatis支持物理分頁(yè),只能通過(guò)基于攔截器的插件來(lái)實(shí)現(xiàn)。當(dāng)時(shí),已有的MyBatis分頁(yè)插件都不適用于公司已經(jīng)開(kāi)發(fā)了大半的項(xiàng)目,因此我有了自己寫(xiě)一個(gè)分頁(yè)插件的想法。完成后的分頁(yè)插件(PageHelper)能很方便地實(shí)現(xiàn)對(duì)MyBatis查詢方法的分頁(yè)。后來(lái),我在CSDN和開(kāi)源中國(guó)的博客中分享了代碼,并且詳細(xì)說(shuō)明了實(shí)現(xiàn)原理。在后續(xù)更新插件的一篇博客評(píng)論中,紅薯(開(kāi)源中國(guó)創(chuàng)始人)說(shuō):“應(yīng)該把代碼放到git.oschina.net中,放網(wǎng)盤(pán)很不專業(yè)哦!”因?yàn)檫@句話,我便踏入了開(kāi)源的世界。
由于PageHelper分頁(yè)插件有越來(lái)越多人使用,因而有很多網(wǎng)友通過(guò)留言、私信、郵件等方式和我討論MyBatis的相關(guān)問(wèn)題。為了解決網(wǎng)友的問(wèn)題以及完善分頁(yè)插件的功能,我深入學(xué)習(xí)了MyBatis的源碼,通過(guò)不斷的學(xué)習(xí),不僅從深層次了解了各種問(wèn)題的產(chǎn)生原因,對(duì)MyBatis的理解也逐漸加深。2014年11月,我利用閑暇時(shí)間又開(kāi)發(fā)了一個(gè)新的開(kāi)源項(xiàng)目:MyBatis通用Mapper,它實(shí)現(xiàn)了MyBatis單表增、刪、改、查的基本方法,能夠幫助開(kāi)發(fā)人員節(jié)省大量時(shí)間。
這幾年來(lái),我一直在博客上面和大家分享MyBatis的相關(guān)內(nèi)容,在這期間和網(wǎng)友交流解決的問(wèn)題有很多是重復(fù)的,也有很多都是基礎(chǔ)的,F(xiàn)在已有的MyBatis學(xué)習(xí)途徑提供給大家的知識(shí),有一些比較深?yuàn)W不適合初學(xué)者,有一些比較基礎(chǔ)卻不全面。為了讓讀者比較容易地全面掌握MyBatis的相關(guān)知識(shí),這本書(shū)得以誕生,本書(shū)將通過(guò)全面完整的大量示例,讓讀者輕松且全面地掌握MyBatis。
閱讀準(zhǔn)備
在開(kāi)始學(xué)習(xí)之前,需要準(zhǔn)備好如下的開(kāi)發(fā)環(huán)境。
JDK1.6及以上版本。
MyBatis3.3.0版本。
MySQL數(shù)據(jù)庫(kù)。
Eclipse4及以上版本。
ApacheMaven構(gòu)建工具。
本書(shū)內(nèi)容
全書(shū)共11章,每一章的具體內(nèi)容如下。
第1章MyBatis入門(mén)
本章先簡(jiǎn)單介紹了MyBatis的發(fā)展歷史和特點(diǎn),然后通過(guò)一步步的操作搭建了一個(gè)學(xué)習(xí)MyBatis的基礎(chǔ)環(huán)境,這個(gè)開(kāi)發(fā)環(huán)境也是學(xué)習(xí)后續(xù)幾個(gè)章節(jié)的基礎(chǔ)。
第2章MyBatisXML方式的基本用法
本章設(shè)定了一個(gè)簡(jiǎn)單的權(quán)限控制需求,使用MyBatisXML方式實(shí)現(xiàn)了數(shù)據(jù)庫(kù)中一個(gè)表的常規(guī)操作。在查詢方面,通過(guò)根據(jù)主鍵查詢和查詢?nèi)績(jī)蓚(gè)方法讓讀者在學(xué)會(huì)使用MyBatis查詢方法的同時(shí),還深入了解MyBatis返回值的設(shè)置原理。在增、刪、改方面提供了大量詳細(xì)的示例,這些示例覆蓋了MyBatis基本用法的方方面面。
第3章MyBatis注解方式的基本用法
雖然XML方式是主流,但是仍然有許多公司選擇了注解方式,因此本章非常適合使用注解方式的讀者。本章使用注解方式幾乎實(shí)現(xiàn)了同XML方式類似的全部方法,包含許多常用注解的基本用法。對(duì)于初學(xué)者來(lái)說(shuō),即使不使用注解方式,通過(guò)本章和第2章的對(duì)比也可以對(duì)MyBatis有更深的了解。
第4章MyBatis動(dòng)態(tài)SQL
本章詳細(xì)介紹了MyBatis最強(qiáng)大的動(dòng)態(tài)SQL功能,通過(guò)豐富的示例講解了各種動(dòng)態(tài)SQL的用法,為動(dòng)態(tài)SQL中可能出現(xiàn)的問(wèn)題提供了最佳實(shí)踐方案,還提供了動(dòng)態(tài)SQL中常用的OGNL用法。
第5章MyBatis代碼生成器
本章介紹的MyBatis代碼生成器可以減輕基本用法中最繁重的那部分書(shū)寫(xiě)工作帶來(lái)的壓力。通過(guò)本章的學(xué)習(xí),可以使用代碼生成器快速生成大量基礎(chǔ)的方法,讓大家更專注于業(yè)務(wù)代碼的開(kāi)發(fā),從枯燥的基礎(chǔ)編碼中解脫出來(lái)。
第6章MyBatis高級(jí)查詢
本章介紹了MyBatis中的高級(jí)結(jié)果映射,包括一對(duì)一映射、一對(duì)多映射和鑒別器映射。通過(guò)循序漸進(jìn)的代碼示例讓讀者輕松地學(xué)會(huì)使用MyBatis中最高級(jí)的結(jié)果映射。本章還通過(guò)全面的示例講解了存儲(chǔ)過(guò)程的用法和類型處理器的用法。
第7章MyBatis緩存配置
本章講解了MyBatis緩存配置的相關(guān)內(nèi)容,提供了EhCache緩存和Redis緩存的集成方法。雖然二級(jí)緩存功能強(qiáng)大,但是使用不當(dāng)很容易產(chǎn)生臟數(shù)據(jù)。本章針對(duì)臟數(shù)據(jù)的產(chǎn)生提供了最佳解決方案,并且介紹了二級(jí)緩存適用的場(chǎng)景。
第8章MyBatis插件開(kāi)發(fā)
本章介紹了MyBatis強(qiáng)大的擴(kuò)展能力,利用插件可以很方便地在運(yùn)行時(shí)改變MyBatis的行為。通過(guò)兩個(gè)插件示例讓讀者初窺門(mén)徑,結(jié)合第11章的內(nèi)容可以讓讀者開(kāi)發(fā)出適合自己的插件。
第9章Spring集成MyBatis
本章介紹了最流行的輕量級(jí)框架Spring集成MyBatis的方法,通過(guò)一步步操作從零開(kāi)始配置,搭建一個(gè)基本的Spring、SpringMVC、MyBatis開(kāi)發(fā)環(huán)境。
第10章SpringBoot集成MyBatis
本章介紹了最流行的微服務(wù)框架SpringBoot集成MyBatis的方法,通過(guò)MyBatis官方提供的Starter可以很方便地進(jìn)行集成。同時(shí),本章對(duì)Starter中的配置做了簡(jiǎn)單的介紹,可以滿足讀者對(duì)MyBatis各項(xiàng)配置方面的需要。
第11章MyBatis開(kāi)源項(xiàng)目
本章是一扇通往開(kāi)源世界的大門(mén),也是一扇通往MyBatis源碼學(xué)習(xí)的大門(mén)。從Git入門(mén)到GitHub入門(mén),讀者可以學(xué)會(huì)使用最流行的分布式版本控制系統(tǒng)和源代碼托管服務(wù)。通過(guò)一段代碼讓大家了解MyBatis中的一部分關(guān)鍵類,通過(guò)代碼包講解可以了解MyBatis每個(gè)包中所含的功能。最后通過(guò)MyBatis豐富的測(cè)試用例為讀者提供更多更有用的學(xué)習(xí)內(nèi)容。
致謝
從決定寫(xiě)書(shū),到這本書(shū)能夠出版,中間經(jīng)歷了很多,因此深感來(lái)之不易。在這個(gè)過(guò)程中,要感謝所有為本書(shū)做出過(guò)貢獻(xiàn)的人。感謝我的父母對(duì)我事業(yè)的默默支持。感謝我的妻子參與了本書(shū)的審校工作,給我提供了許多寶貴意見(jiàn)。感謝我的朋友黃勇、熔巖、楊新倫、悠然在百忙之中抽出時(shí)間為我的新書(shū)作序推薦。感謝博文視點(diǎn)的策劃編輯孫奇俏的持續(xù)跟進(jìn)和大力協(xié)助,同時(shí)感謝電子工業(yè)出版社和博文視點(diǎn)的其他老師給予本書(shū)的專業(yè)意見(jiàn)。最后,感謝每一位閱讀本書(shū)的讀者,希望本書(shū)能給您帶來(lái)幫助。衷心感謝大家。
聯(lián)系作者
由衷地感謝大家購(gòu)買(mǎi)此書(shū),希望大家會(huì)喜歡,也希望這本書(shū)能夠?yàn)楦魑蛔x者帶來(lái)所希望獲得的知識(shí)。雖然我已經(jīng)非常細(xì)心地檢查書(shū)中所提到的所有內(nèi)容,但仍有可能存在疏漏,若大家在閱讀過(guò)程中發(fā)現(xiàn)錯(cuò)誤,在此我先表示歉意。歡迎各位讀者對(duì)本書(shū)的內(nèi)容和相關(guān)源代碼發(fā)表意見(jiàn)和評(píng)論。大家可以通過(guò)我的個(gè)人郵箱abel533@gmail.com與我取得聯(lián)系,我會(huì)一一解答每個(gè)人的疑惑。
劉增輝,資深Java工程師,熱愛(ài)技術(shù)研究,樂(lè)于分享心得,活躍于CSDN和開(kāi)源中國(guó)網(wǎng)站。對(duì)MyBatis源碼有著深入研究,同時(shí)熱衷于開(kāi)源項(xiàng)目,在GitHub和開(kāi)源中國(guó)網(wǎng)站上發(fā)布了多個(gè)開(kāi)源項(xiàng)目,是MyBatis官方推薦的分頁(yè)插件PageHelper和通用Mapper的作者,所發(fā)布項(xiàng)目受到了數(shù)千人的關(guān)注。
第1章 MyBatis入門(mén) 1
1.1 MyBatis簡(jiǎn)介 2
1.2 創(chuàng)建Maven項(xiàng)目 3
1.3 簡(jiǎn)單配置讓MyBatis跑起來(lái) 7
1.3.1 準(zhǔn)備數(shù)據(jù)庫(kù) 8
1.3.2 配置MyBatis 8
1.3.3 創(chuàng)建實(shí)體類和Mapper.xml文件 10
1.3.4 配置Log4j以便查看MyBatis操作數(shù)據(jù)庫(kù)的過(guò)程 11
1.3.5 編寫(xiě)測(cè)試代碼讓MyBatis跑起來(lái) 12
1.4 本章小結(jié) 14
第2章 MyBatis XML方式的基本用法 15
2.1 一個(gè)簡(jiǎn)單的權(quán)限控制需求 16
2.1.1 創(chuàng)建數(shù)據(jù)庫(kù)表 16
2.1.2 創(chuàng)建實(shí)體類 19
2.2 使用XML方式 21
2.3 select用法 23
2.4 insert用法 35
2.4.1 簡(jiǎn)單的insert方法 35
2.4.2 使用JDBC方式返回主鍵自增的值 38
2.4.3 使用selectKey返回主鍵的值 40
2.5 update用法 42
2.6 delete用法 45
2.7 多個(gè)接口參數(shù)的用法 47
2.8 Mapper接口動(dòng)態(tài)代理實(shí)現(xiàn)原理 50
2.9 本章小結(jié) 51
第3章 MyBatis注解方式的基本用法 53
3.1 @Select注解 54
3.1.1 使用mapUnderscoreToCamelCase配置 55
3.1.2 使用resultMap方式 55
3.2 @Insert注解 58
3.2.1 不需要返回主鍵 58
3.2.2 返回自增主鍵 58
3.2.3 返回非自增主鍵 59
3.3 @Update注解和@Delete注解 59
3.4 Provider注解 60
3.5 本章小結(jié) 61
第4章 MyBatis動(dòng)態(tài)SQL 63
4.1 if用法 64
4.1.1 在WHERE條件中使用if 64
4.1.2 在UPDATE更新列中使用if 68
4.1.3 在INSERT動(dòng)態(tài)插入列中使用if 70
4.2 choose用法 72
4.3 where、set、trim用法 75
4.3.1 where用法 75
4.3.2 set用法 76
4.3.3 trim用法 77
4.4 foreach用法 78
4.4.1 foreach實(shí)現(xiàn)in集合 78
4.4.2 foreach實(shí)現(xiàn)批量插入 81
4.4.3 foreach實(shí)現(xiàn)動(dòng)態(tài)UPDATE 84
4.5 bind用法 86
4.6 多數(shù)據(jù)庫(kù)支持 86
4.7 OGNL用法 89
4.8 本章小結(jié) 90
第5章 Mybatis代碼生成器 91
5.1 XML配置詳解 92
5.1.1 property標(biāo)簽 95
5.1.2 plugin標(biāo)簽 96
5.1.3 commentGenerator標(biāo)簽 97
5.1.4 jdbcConnection標(biāo)簽 99
5.1.5 javaTypeResolver標(biāo)簽 100
5.1.6 javaModelGenerator標(biāo)簽 101
5.1.7 sqlMapGenerator標(biāo)簽 102
5.1.8 javaClientGenerator標(biāo)簽 103
5.1.9 table標(biāo)簽 104
5.2 一個(gè)配置參考示例 109
5.3 運(yùn)行MyBatis Generator 111
5.3.1 使用Java編寫(xiě)代碼運(yùn)行 111
5.3.2 從命令提示符運(yùn)行 113
5.3.3 使用Maven Plugin運(yùn)行 115
5.3.4 使用Eclipse插件運(yùn)行 117
5.4 Example介紹 119
5.5 本章小結(jié) 124
第6章 MyBatis高級(jí)查詢 125
6.1 高級(jí)結(jié)果映射 126
6.1.1 一對(duì)一映射 126
6.1.2 一對(duì)多映射 140
6.1.3 鑒別器映射 156
6.2 存儲(chǔ)過(guò)程 159
6.2.1 第一個(gè)存儲(chǔ)過(guò)程 162
6.2.2 第二個(gè)存儲(chǔ)過(guò)程 164
6.2.3 第三個(gè)和第四個(gè)存儲(chǔ)過(guò)程 166
6.2.4 在Oracle中使用游標(biāo)參數(shù)的存儲(chǔ)過(guò)程 168
6.3 使用枚舉或其他對(duì)象 170
6.3.1 使用MyBatis提供的枚舉處理器 170
6.3.2 使用自定義的類型處理器 172
6.3.3 對(duì)Java 8日期(JSR-310)的支持 175
6.4 本章小結(jié) 176
第7章 MyBatis緩存配置 177
7.1 一級(jí)緩存 178
7.2 二級(jí)緩存 181
7.2.1 配置二級(jí)緩存 181
7.2.2 使用二級(jí)緩存 184
7.3 集成EhCache緩存 187
7.4 集成Redis緩存 190
7.5 臟數(shù)據(jù)的產(chǎn)生和避免 191
7.6 二級(jí)緩存適用場(chǎng)景 194
7.7 本章小結(jié) 194
第8章 MyBatis插件開(kāi)發(fā) 195
8.1 攔截器接口介紹 196
8.2 攔截器簽名介紹 198
8.2.1 Executor接口 198
8.2.2 ParameterHandler接口 200
8.2.3 ResultSetHandler接口 201
8.2.4 StatementHandler接口 202
8.3 下畫(huà)線鍵值轉(zhuǎn)小寫(xiě)駝峰形式插件 203
8.4 分頁(yè)插件 206
8.4.1 PageInterceptor攔截器類 207
8.4.2 Dialect接口 212
8.4.3 MySqlDialect實(shí)現(xiàn) 216
8.5 本章小結(jié) 220
第9章 Spring集成MyBatis 221
9.1 創(chuàng)建基本的Maven Web項(xiàng)目 222
9.2 集成Spring和Spring MVC 227
9.3 集成MyBatis 232
9.4 幾個(gè)簡(jiǎn)單實(shí)例 234
9.4.1 基本準(zhǔn)備 235
9.4.2 開(kāi)發(fā)Mapper層(Dao層) 235
9.4.3 開(kāi)發(fā)業(yè)務(wù)層(Service層) 238
9.4.4 開(kāi)發(fā)控制層(Controller層) 240
9.4.5 開(kāi)發(fā)視圖層(View層) 242
9.4.6 部署和運(yùn)行應(yīng)用 245
9.5 本章小結(jié) 246
第10章 Spring Boot集成MyBatis 247
10.1 基本的Spring Boot項(xiàng)目 248
10.2 集成MyBatis 251
10.3 MyBatis Starter配置介紹 253
10.4 簡(jiǎn)單示例 255
10.4.1 引入simple依賴 255
10.4.2 開(kāi)發(fā)業(yè)務(wù)(Service)層 258
10.4.3 開(kāi)發(fā)控制(Controller)層 259
10.4.4 運(yùn)行應(yīng)用查看效果 259
10.5 本章小結(jié) 260
第11章 MyBatis開(kāi)源項(xiàng)目 261
11.1 Git入門(mén) 262
11.1.1 初次運(yùn)行配置 262
11.1.2 初始化和克隆倉(cāng)庫(kù) 263
11.1.3 本地操作 265
11.1.4 遠(yuǎn)程操作 267
11.2 GitHub入門(mén) 269
11.2.1 創(chuàng)建并提交到倉(cāng)庫(kù) 269
11.2.2 Fork倉(cāng)庫(kù)并克隆到本地 272
11.2.3 社交功能 275
11.3 MyBatis源碼講解 278
11.4 MyBatis測(cè)試用例 290
11.5 本章小結(jié) 293
附錄 類型處理器(TypeHandler) 295