關(guān)于我們
書單推薦
新書推薦
|
MyBatis從入門到精通
《MyBatis從入門到精通》中從一個(gè)簡單的MyBatis查詢?nèi)胧,搭建起學(xué)習(xí)MyBatis的基礎(chǔ)開發(fā)環(huán)境。通過全面的示例代碼和測試講解了在MyBatis XML方式和注解方式中進(jìn)行增、刪、改、查操作的基本用法,介紹了動(dòng)態(tài)SQL在不同方面的應(yīng)用以及在使用過程中的zui佳實(shí)踐方案。針對MyBatis高級映射、存儲(chǔ)過程和類型處理器提供了豐富的示例,通過自下而上的方法使讀者更好地理解和掌握MyBatis的高級用法,同時(shí)針對MyBatis的代碼生成器提供了詳細(xì)的配置介紹。此外,《MyBatis從入門到精通》還提供了緩存配置、插件開發(fā)、Spring、Spring Boot集成的詳細(xì)內(nèi)容。zui后通過介紹Git和GitHub讓讀者了解MyBatis開源項(xiàng)目,通過對MyBatis源碼和測試用例的講解讓讀者更好掌握MyBatis。
適讀人群:Java開發(fā)人員
1.資深Java開發(fā)工程師執(zhí)筆 作者是資深Java開發(fā)工程師,活躍于CSDN及開源中國,對MyBatis研究深入,是MyBatis官方推薦的分頁插件PageHelper即通用Mapper的作者。 2.示例完整,注釋詳細(xì) 《MyBatis從入門到精通》中的示例代碼都非常完整,同時(shí)每行核心語句都附有注釋,可以幫助讀者輕松掌握代碼的內(nèi)容,快速入門,持續(xù)深化,舉一反三。 2.解讀源碼,資源豐富 《MyBatis從入門到精通》的特點(diǎn)在于詳細(xì)解讀MyBatis源代碼,帶領(lǐng)大家深入理解源碼核心。另外,作者開源了許多優(yōu)秀項(xiàng)目(MyBatis官方推薦的擴(kuò)展組件等),每一位讀者都可以獲得《MyBatis從入門到精通》的寶貴資源,并與作者交流討論。
自2013年起,我開始帶領(lǐng)團(tuán)隊(duì)開發(fā)項(xiàng)目,公司此前使用的是一套深度集成的Spring、Struts和Hibernate框架,這套重量級框架顯然已經(jīng)不適合用在全新的項(xiàng)目中。當(dāng)時(shí)使用的Hibernate還是較早的版本,在項(xiàng)目的業(yè)務(wù)層需要拼接大量的SQL和HQL才能進(jìn)行數(shù)據(jù)庫操作。綜合多方面因素,我決定選擇其他持久化框架進(jìn)行項(xiàng)目開發(fā)。因?yàn)镸yBatisSQL和代碼分離的方式以及動(dòng)態(tài)SQL的強(qiáng)大功能,加之其在對查詢結(jié)果進(jìn)行映射處理等方面具有顯著優(yōu)點(diǎn),因此,我與MyBatis開始結(jié)緣。
為了提高查詢效率,通常會(huì)采用物理分頁,然而MyBatis只能支持內(nèi)存分頁。若想讓MyBatis支持物理分頁,只能通過基于攔截器的插件來實(shí)現(xiàn)。當(dāng)時(shí),已有的MyBatis分頁插件都不適用于公司已經(jīng)開發(fā)了大半的項(xiàng)目,因此我有了自己寫一個(gè)分頁插件的想法。完成后的分頁插件(PageHelper)能很方便地實(shí)現(xiàn)對MyBatis查詢方法的分頁。后來,我在CSDN和開源中國的博客中分享了代碼,并且詳細(xì)說明了實(shí)現(xiàn)原理。在后續(xù)更新插件的一篇博客評論中,紅薯(開源中國創(chuàng)始人)說:“應(yīng)該把代碼放到git.oschina.net中,放網(wǎng)盤很不專業(yè)哦!”因?yàn)檫@句話,我便踏入了開源的世界。 由于PageHelper分頁插件有越來越多人使用,因而有很多網(wǎng)友通過留言、私信、郵件等方式和我討論MyBatis的相關(guān)問題。為了解決網(wǎng)友的問題以及完善分頁插件的功能,我深入學(xué)習(xí)了MyBatis的源碼,通過不斷的學(xué)習(xí),不僅從深層次了解了各種問題的產(chǎn)生原因,對MyBatis的理解也逐漸加深。2014年11月,我利用閑暇時(shí)間又開發(fā)了一個(gè)新的開源項(xiàng)目:MyBatis通用Mapper,它實(shí)現(xiàn)了MyBatis單表增、刪、改、查的基本方法,能夠幫助開發(fā)人員節(jié)省大量時(shí)間。 這幾年來,我一直在博客上面和大家分享MyBatis的相關(guān)內(nèi)容,在這期間和網(wǎng)友交流解決的問題有很多是重復(fù)的,也有很多都是基礎(chǔ)的,F(xiàn)在已有的MyBatis學(xué)習(xí)途徑提供給大家的知識,有一些比較深?yuàn)W不適合初學(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ā)展歷史和特點(diǎn),然后通過一步步的操作搭建了一個(gè)學(xué)習(xí)MyBatis的基礎(chǔ)環(huán)境,這個(gè)開發(fā)環(huán)境也是學(xué)習(xí)后續(xù)幾個(gè)章節(jié)的基礎(chǔ)。 第2章MyBatisXML方式的基本用法 本章設(shè)定了一個(gè)簡單的權(quán)限控制需求,使用MyBatisXML方式實(shí)現(xiàn)了數(shù)據(jù)庫中一個(gè)表的常規(guī)操作。在查詢方面,通過根據(jù)主鍵查詢和查詢?nèi)績蓚(gè)方法讓讀者在學(xué)會(huì)使用MyBatis查詢方法的同時(shí),還深入了解MyBatis返回值的設(shè)置原理。在增、刪、改方面提供了大量詳細(xì)的示例,這些示例覆蓋了MyBatis基本用法的方方面面。 第3章MyBatis注解方式的基本用法 雖然XML方式是主流,但是仍然有許多公司選擇了注解方式,因此本章非常適合使用注解方式的讀者。本章使用注解方式幾乎實(shí)現(xiàn)了同XML方式類似的全部方法,包含許多常用注解的基本用法。對于初學(xué)者來說,即使不使用注解方式,通過本章和第2章的對比也可以對MyBatis有更深的了解。 第4章MyBatis動(dòng)態(tài)SQL 本章詳細(xì)介紹了MyBatis最強(qiáng)大的動(dòng)態(tài)SQL功能,通過豐富的示例講解了各種動(dòng)態(tài)SQL的用法,為動(dòng)態(tài)SQL中可能出現(xiàn)的問題提供了最佳實(shí)踐方案,還提供了動(dòng)態(tài)SQL中常用的OGNL用法。 第5章MyBatis代碼生成器 本章介紹的MyBatis代碼生成器可以減輕基本用法中最繁重的那部分書寫工作帶來的壓力。通過本章的學(xué)習(xí),可以使用代碼生成器快速生成大量基礎(chǔ)的方法,讓大家更專注于業(yè)務(wù)代碼的開發(fā),從枯燥的基礎(chǔ)編碼中解脫出來。 第6章MyBatis高級查詢 本章介紹了MyBatis中的高級結(jié)果映射,包括一對一映射、一對多映射和鑒別器映射。通過循序漸進(jìn)的代碼示例讓讀者輕松地學(xué)會(huì)使用MyBatis中最高級的結(jié)果映射。本章還通過全面的示例講解了存儲(chǔ)過程的用法和類型處理器的用法。 第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)行時(shí)改變MyBatis的行為。通過兩個(gè)插件示例讓讀者初窺門徑,結(jié)合第11章的內(nèi)容可以讓讀者開發(fā)出適合自己的插件。 第9章Spring集成MyBatis 本章介紹了最流行的輕量級框架Spring集成MyBatis的方法,通過一步步操作從零開始配置,搭建一個(gè)基本的Spring、SpringMVC、MyBatis開發(fā)環(huán)境。 第10章SpringBoot集成MyBatis 本章介紹了最流行的微服務(wù)框架SpringBoot集成MyBatis的方法,通過MyBatis官方提供的Starter可以很方便地進(jìn)行集成。同時(shí),本章對Starter中的配置做了簡單的介紹,可以滿足讀者對MyBatis各項(xiàng)配置方面的需要。 第11章MyBatis開源項(xiàng)目 本章是一扇通往開源世界的大門,也是一扇通往MyBatis源碼學(xué)習(xí)的大門。從Git入門到GitHub入門,讀者可以學(xué)會(huì)使用最流行的分布式版本控制系統(tǒng)和源代碼托管服務(wù)。通過一段代碼讓大家了解MyBatis中的一部分關(guān)鍵類,通過代碼包講解可以了解MyBatis每個(gè)包中所含的功能。最后通過MyBatis豐富的測試用例為讀者提供更多更有用的學(xué)習(xí)內(nèi)容。 致謝 從決定寫書,到這本書能夠出版,中間經(jīng)歷了很多,因此深感來之不易。在這個(gè)過程中,要感謝所有為本書做出過貢獻(xiàn)的人。感謝我的父母對我事業(yè)的默默支持。感謝我的妻子參與了本書的審校工作,給我提供了許多寶貴意見。感謝我的朋友黃勇、熔巖、楊新倫、悠然在百忙之中抽出時(shí)間為我的新書作序推薦。感謝博文視點(diǎn)的策劃編輯孫奇俏的持續(xù)跟進(jìn)和大力協(xié)助,同時(shí)感謝電子工業(yè)出版社和博文視點(diǎn)的其他老師給予本書的專業(yè)意見。最后,感謝每一位閱讀本書的讀者,希望本書能給您帶來幫助。衷心感謝大家。 聯(lián)系作者 由衷地感謝大家購買此書,希望大家會(huì)喜歡,也希望這本書能夠?yàn)楦魑蛔x者帶來所希望獲得的知識。雖然我已經(jīng)非常細(xì)心地檢查書中所提到的所有內(nèi)容,但仍有可能存在疏漏,若大家在閱讀過程中發(fā)現(xiàn)錯(cuò)誤,在此我先表示歉意。歡迎各位讀者對本書的內(nèi)容和相關(guān)源代碼發(fā)表意見和評論。大家可以通過我的個(gè)人郵箱abel533@gmail.com與我取得聯(lián)系,我會(huì)一一解答每個(gè)人的疑惑。
劉增輝,資深Java工程師,熱愛技術(shù)研究,樂于分享心得,活躍于CSDN和開源中國網(wǎng)站。對MyBatis源碼有著深入研究,同時(shí)熱衷于開源項(xiàng)目,在GitHub和開源中國網(wǎng)站上發(fā)布了多個(gè)開源項(xiàng)目,是MyBatis官方推薦的分頁插件PageHelper和通用Mapper的作者,所發(fā)布項(xiàng)目受到了數(shù)千人的關(guān)注。
第1章 MyBatis入門 1
1.1 MyBatis簡介 2 1.2 創(chuàng)建Maven項(xiàng)目 3 1.3 簡單配置讓MyBatis跑起來 7 1.3.1 準(zhǔn)備數(shù)據(jù)庫 8 1.3.2 配置MyBatis 8 1.3.3 創(chuàng)建實(shí)體類和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 一個(gè)簡單的權(quán)限控制需求 16 2.1.1 創(chuàng)建數(shù)據(jù)庫表 16 2.1.2 創(chuàng)建實(shí)體類 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 多個(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ù)庫支持 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編寫代碼運(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 存儲(chǔ)過程 159 6.2.1 第一個(gè)存儲(chǔ)過程 162 6.2.2 第二個(gè)存儲(chǔ)過程 164 6.2.3 第三個(gè)和第四個(gè)存儲(chǔ)過程 166 6.2.4 在Oracle中使用游標(biāo)參數(shù)的存儲(chǔ)過程 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實(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è)簡單實(shí)例 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項(xiàng)目 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開源項(xiàng)目 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
分離是為了更好的相聚
2013年,我在開源中國網(wǎng)站上認(rèn)識了本書作者劉增輝,并和他多次探討過關(guān)于Java開源框架的種種技術(shù)問題。那段時(shí)間,我正在開源一款名為SmartFramework的輕量級JavaWeb框架,當(dāng)時(shí)我不敢奢望自己開源的框架會(huì)有多少人認(rèn)可,但沒想到后來還真有不少朋友們?yōu)榇丝蚣芴岢隽藢氋F建議并做出了巨大貢獻(xiàn)。尤其是在數(shù)據(jù)持久層這塊,增輝給了我許多支持與幫助,讓我感受到開源帶給我的不僅是技術(shù)能力上的提升,更多的是讓自己感到快樂。 我了解到增輝對MyBatis的研究頗為深入,不僅對MyBatis的內(nèi)核,甚至對于其擴(kuò)展都能做到了然于心、游刃有余。他曾經(jīng)也開源了許多MyBatis核心組件,幫助許多開發(fā)者提高了工作效率,而我正是這眾多開發(fā)者中的一位。 我不想占用這篇推薦序的寶貴篇幅為大家講解如何來使用MyBatis,因?yàn)檫@本書中對MyBatis的介紹遠(yuǎn)比我講的更加詳細(xì)和深入,F(xiàn)在我只想和大家聊聊架構(gòu)設(shè)計(jì)中的一個(gè)核心問題:關(guān)注點(diǎn)分離。因?yàn)檫@個(gè)問題同樣也是MyBatis框架需要解決的核心問題。 關(guān)注點(diǎn)分離 關(guān)注點(diǎn)分離所對應(yīng)的英文是SeparationofConcerns,簡稱SOC。它是最經(jīng)典的架構(gòu)設(shè)計(jì)原則之一,在許多架構(gòu)設(shè)計(jì)中被廣泛使用。關(guān)注點(diǎn)分離原則為我們的架構(gòu)設(shè)計(jì)提出了三點(diǎn)要求。 1.架構(gòu)中需要變化的部分,一定要能夠非常清晰地被識別出來。 2.若架構(gòu)中某部分發(fā)生變化,則該變化不會(huì)影響到其他部分。 3.若架構(gòu)中某部分需要擴(kuò)展,則該擴(kuò)展也不會(huì)影響到其他部分。 架構(gòu)能做到關(guān)注點(diǎn)分離,才能做到真正意義上的解耦,這是架構(gòu)師們需要努力實(shí)現(xiàn)的目標(biāo)。如果大家要問,關(guān)注點(diǎn)分離做得最有效的落地實(shí)踐是什么?我們首先能想到的就是“前后端分離”。 前后端分離 曾經(jīng)我們開發(fā)Web應(yīng)用程序時(shí),對前端和后端的概念不太清晰,開發(fā)者們逐漸認(rèn)為前端和后端有必要進(jìn)行分離了,前端需要考慮界面展現(xiàn)與數(shù)據(jù)展現(xiàn)問題,后端需要考慮業(yè)務(wù)邏輯與數(shù)據(jù)邏輯問題。可見,前端和后端所關(guān)注的問題是完全不同的,應(yīng)該在架構(gòu)上將它們進(jìn)行分離。此外,在團(tuán)隊(duì)協(xié)作上也能將前端與后端這兩部分的工作進(jìn)行分離,因此出現(xiàn)了前端工程師與后端工程師這兩個(gè)不同崗位。這樣分工絕不是偶然的,它不僅讓架構(gòu)變得更加解耦,還能顯著地提升團(tuán)隊(duì)的開發(fā)效率。 針對前端工程師而言,需要將界面展現(xiàn)與數(shù)據(jù)展現(xiàn)相分離;針對后端工程師而言,不僅要清晰地理解業(yè)務(wù)邏輯,善于將數(shù)據(jù)進(jìn)行合理的建模,最終還要做到將業(yè)務(wù)邏輯與數(shù)據(jù)邏輯相分離。 業(yè)務(wù)邏輯與數(shù)據(jù)邏輯相分離 業(yè)務(wù)邏輯對于我們而言已經(jīng)很清楚了,但數(shù)據(jù)邏輯包括哪些呢?最直接的就是一個(gè)個(gè)對應(yīng)于數(shù)據(jù)庫中每張數(shù)據(jù)表的實(shí)體對象,它有一個(gè)很好聽的名字:數(shù)據(jù)訪問對象,即DataAccessObject,簡稱DAO。很明顯,這一層數(shù)據(jù)直接和底層數(shù)據(jù)庫打交道,我們將它們從業(yè)務(wù)邏輯中分離出來,并加以封裝。也就是說,沒必要為每一個(gè)DAO對象初始化的過程去編寫大量的代碼,這些代碼應(yīng)該封裝到一個(gè)框架中。我們只需要編寫相應(yīng)的SQL語句,并將這些SQL語句從業(yè)務(wù)代碼中分離出來,最終將執(zhí)行SQL語句所得到的結(jié)果集映射到DAO對象中即可。 不知道大家對我剛剛提到的“關(guān)注點(diǎn)分離”有怎樣的理解。無論大家理解或深或淺,毫無疑問,這個(gè)問題都已成為架構(gòu)中最核心的部分。 MyBatis就是這樣的框架——它能幫助我們將業(yè)務(wù)邏輯與數(shù)據(jù)邏輯相分離,讓開發(fā)應(yīng)用程序的過程變得更加高效。究竟MyBatis中隱藏著怎樣的奧秘?不要急,這本書將為大家揭曉答案。 作者增輝停下開發(fā)的腳步,通過深思熟慮和細(xì)心總結(jié),把動(dòng)態(tài)的實(shí)踐靜止到了紙張上,為各位讀者悉心解讀MyBatis的方方面面。相信他創(chuàng)作這本書的過程亦如當(dāng)初刻苦自學(xué)MyBatis并在各大社區(qū)開源自己編寫的核心組件的過程,傾注了全部的熱情和心血。不忘初心,方得始終,希望各位讀者能夠喜歡這本書,并從中有所收獲。 《架構(gòu)探險(xiǎn)》作者、特贊科技CTO,黃勇 2017年5月
你還可能感興趣
我要評論
|