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