關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
Spring Data JPA:入門(mén)、實(shí)戰(zhàn)與進(jìn)階 本書(shū)是作者多年來(lái)的經(jīng)驗(yàn)總結(jié),以語(yǔ)法 源碼 原理 實(shí)戰(zhàn)經(jīng)驗(yàn)的形式全面介紹了 Spring Data JPA。當(dāng)你深入研究和理解了Spring Data JPA之后,就會(huì)發(fā)現(xiàn)它真是個(gè)好東西,從而真正掌握和發(fā)掘 Spring Data JPA 的實(shí)踐價(jià)值。 【本書(shū)共 33章,主要分為四部分】 (1)資深架構(gòu)師多年一線(xiàn)JPA開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié),資深專(zhuān)家多年經(jīng)驗(yàn)總結(jié),從入門(mén)到精通,從原理到實(shí)戰(zhàn),深入淺出地完整掌握Spring Data JPA,從而提升開(kāi)發(fā)效率。 適讀人群: (1)有一定開(kāi)發(fā)經(jīng)驗(yàn),想系統(tǒng)地學(xué)習(xí) JPA 技術(shù); (2)需要掌握分布式經(jīng)驗(yàn)和原理的資深Java 開(kāi)發(fā)工程師; (3)Java 初級(jí)、中級(jí)架構(gòu)師 (4)JDBC、iBatis、Mybatis、mybatis-spring-boot-starter 、Hibernate 的使用者 (5)Spring Boot 2.0 使用者 你好,我是張振華,在Java領(lǐng)域從業(yè)已有十幾年,也算是一個(gè)Java老兵了,我曾先后在驢媽媽、攜程等互聯(lián)網(wǎng)公司擔(dān)任Java架構(gòu)師、開(kāi)發(fā)主管等職務(wù)。在工作期間,我既負(fù)責(zé)過(guò)后端服務(wù)的平臺(tái)架構(gòu),也實(shí)現(xiàn)過(guò)微服務(wù)的升級(jí),同時(shí)還寫(xiě)過(guò)公司的很多核心框架,遇到過(guò)很多人都會(huì)遇到的常見(jiàn)問(wèn)題,積累并總結(jié)了一些可以復(fù)用和遷移的寶貴經(jīng)驗(yàn)。 【我是如何學(xué)習(xí)Spring Data JPA的】 大概四五年前,公司入職了一批架構(gòu)師,他們引入了Spring Data JPA框架。起初接觸這個(gè)框架時(shí)我的確很排斥,心想,這么復(fù)雜的框架真不如MyBatis簡(jiǎn)單隨便寫(xiě)個(gè)簡(jiǎn)單的SQL就好了,為什么要學(xué)習(xí)JPA呢?而且還要學(xué)習(xí)一大堆相關(guān)聯(lián)的東西(比如要了解Session原理),這么復(fù)雜,它有什么好處呢?加上那時(shí)候我對(duì)JPA框架的理解不是很深入,也沒(méi)有研究其背后的原理,寫(xiě)的代碼常常會(huì)有各種Bug…… 但冷靜下來(lái)之后,我才意識(shí)到其實(shí)是自己一直待在所謂的舒適區(qū)的緣故,既然公司的資深架構(gòu)師們引入了這門(mén)技術(shù),那它肯定是有好處的,不如就先用著,只有掌握了這門(mén)技術(shù)才能知道它到底好不好。既然是做技術(shù)的,總要有點(diǎn)追求,有點(diǎn)極客精神,否則很容易跟不上技術(shù)發(fā)展的速度和時(shí)代發(fā)展的潮流。 于是,我決定潛心研究一番。而那時(shí)候,資深架構(gòu)師只負(fù)責(zé)引入Spring Data JPA技術(shù),不負(fù)責(zé)講解其使用原理,自己摸索起來(lái)比較吃力,我確實(shí)也走了不少?gòu)澛。一開(kāi)始只掌握Spring Data JPA的基本用法時(shí)我就遇到了一些問(wèn)題(比如一個(gè)常見(jiàn)的動(dòng)態(tài)SQL問(wèn)題),由于研究得不太多,用起來(lái)別別扭扭的,雖然功能實(shí)現(xiàn)了,但總感覺(jué)不是實(shí)踐,反而降低了開(kāi)發(fā)效率。 后來(lái)我通過(guò)參考官方文檔,以及網(wǎng)上搜索的零星資料,逐漸掌握了一些高級(jí)用法。但在遇到一些復(fù)雜的場(chǎng)景,如在多線(xiàn)程、高并發(fā)情況下出現(xiàn)問(wèn)題時(shí),依然弄不明白是怎么回事。這時(shí)我發(fā)現(xiàn)JPA協(xié)議的實(shí)現(xiàn)者是Hibernate,于是我又讀了Hibernate的文檔,發(fā)現(xiàn)Hibernate已經(jīng)發(fā)展好幾代了,遠(yuǎn)不像我們之前想的那么復(fù)雜,這才了解了一些基本原理。懂得了原理之后,就基本可以解決很多異常問(wèn)題了。 隨著自己對(duì)JPA的使用越來(lái)越熟練,Bug沒(méi)有那么多了,開(kāi)發(fā)效率確實(shí)提升了,而且我明顯感覺(jué)自己的技術(shù)能力也提升了很多,如對(duì)Session、事務(wù)、連接池的理解更深入了。同時(shí)我發(fā)現(xiàn)Spring Data JPA框架里面有很多優(yōu)秀的思想,比如樂(lè)觀鎖的處理、分頁(yè)和排序的統(tǒng)一處理、語(yǔ)義化的方法名、動(dòng)態(tài)代理、策略模式等,這些都可以作為我們自己寫(xiě)框架時(shí)的知識(shí)儲(chǔ)備,值得我們學(xué)習(xí)和借鑒。 為了讓自己更加熟悉這門(mén)技術(shù),也為了避免在工作中給別人講解時(shí)誤導(dǎo)他人,后來(lái)我抽時(shí)間看了官方的Java Persistence API約定和規(guī)范,又找了一些業(yè)內(nèi)的專(zhuān)家進(jìn)行溝通與討論,知道了Hibernate的哪些設(shè)計(jì)比較好、哪些設(shè)計(jì)不好,以及我們?cè)趯?shí)際開(kāi)發(fā)中好避免使用的技術(shù)點(diǎn)。 再后來(lái)我為了一探究竟,自己就抽空寫(xiě)文章、寫(xiě)書(shū),然后利用簡(jiǎn)單的案例來(lái)調(diào)試Spring Data JPA的源碼,思考為什么會(huì)有這種語(yǔ)法、具體是怎么寫(xiě)的。通過(guò)這一系列的操作,我又收獲了運(yùn)行原理和用法的實(shí)踐。 這些經(jīng)驗(yàn)都讓我在技術(shù)層面得到了提升,隨后通過(guò)在公司內(nèi)部的分享,也讓身邊的同事眼前一亮,并順利實(shí)現(xiàn)了公司框架的升級(jí),個(gè)人也順利地實(shí)現(xiàn)升職和加薪。因?yàn)槲以谄渲姓嬲芤媪,所以就想把自己的這種經(jīng)歷和經(jīng)驗(yàn)系統(tǒng)整理后分享給你,希望可以幫助你少走一些彎路。 【Spring Data JPA的優(yōu)勢(shì)】 至今,我所在公司的大部分項(xiàng)目都在用Spring Data JPA,究其原因,我認(rèn)為主要是它具有以下四點(diǎn)優(yōu)勢(shì)。 ,大勢(shì)所趨,大公司技能。近兩年由于Spring Cloud、Spring Boot逐漸統(tǒng)一Java框架江湖,而與Spring Boot天然集成的Spring Data JPA也逐漸走進(jìn)了Java開(kāi)發(fā)者的視野,大量嘗鮮者享受到了這門(mén)技術(shù)帶來(lái)的便利。JPA可以使團(tuán)隊(duì)在框架約定下進(jìn)行開(kāi)發(fā),很少出現(xiàn)有性能瓶頸的SQL。因此不難發(fā)現(xiàn)很多大公司,如阿里、騰訊、抖音等,近幾年在招聘的時(shí)候都會(huì)寫(xiě)明要熟悉JPA,這些大公司以及業(yè)內(nèi)很多開(kāi)源的新項(xiàng)目也都在使用JPA。 第二,提升開(kāi)發(fā)效率,F(xiàn)在很多人都知道Spring Data JPA是什么,但是覺(jué)得JPA很難用,使用中發(fā)現(xiàn)Bug后不知道原因。本來(lái)用JPA是為了提升開(kāi)發(fā)效率,不會(huì)使用反倒容易踩很多坑,所以我們需要系統(tǒng)地學(xué)習(xí)它。當(dāng)你遇到復(fù)雜問(wèn)題時(shí),比如,平時(shí)你可能需要花幾個(gè)小時(shí)想方法名、SQL邏輯,如果可以熟練地使用JPA,那么半小時(shí)甚至幾分鐘就可以寫(xiě)好查詢(xún)方法了,再配合測(cè)試用例,你的開(kāi)發(fā)質(zhì)量也會(huì)明顯提高。總之,系統(tǒng)地學(xué)習(xí)可以讓你少走很多彎路。 第三,提高技術(shù)水平。Spring Data對(duì)數(shù)據(jù)操作進(jìn)行了大統(tǒng)一,即統(tǒng)一了抽象關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)的接口、公共部分。當(dāng)掌握了Spring Data JPA框架后,你幾乎可以達(dá)到輕易實(shí)現(xiàn)Redis、MongoDB等NoSQL操作的水平,因?yàn)樗鼈兌加薪y(tǒng)一的Spring Data Commons。如下圖所示,從中你可以看到Spring Data和JPA的全景位置關(guān)系,這樣一來(lái),就可以清楚地知道JPA的重要作用和脈絡(luò)了。 第四,求職加分項(xiàng)。如果簡(jiǎn)歷中突出Spring Data JPA框架的使用,會(huì)讓面試官眼前一亮。因?yàn)檎莆樟薐PA,就意味著掌握了很多原理,如Session原理、事務(wù)原理、PersistenceContext原理等,而掌握了底層原理對(duì)于技術(shù)人員來(lái)說(shuō)可以在開(kāi)發(fā)中解決很多問(wèn)題。因此,公司可以由此更好地過(guò)濾和篩選人才,也能從側(cè)面看出求職者是否對(duì)技術(shù)足夠感興趣。我認(rèn)為未來(lái)3~5年,使用Spring Data JPA的人會(huì)越來(lái)越多,你可以在拉勾招聘網(wǎng)站上看到,很多招聘信息都會(huì)要求熟練掌握Spring Data JPA。 【為什么要寫(xiě)這本書(shū)】 因?yàn)槲易约航?jīng)歷了上述曲折的實(shí)踐,還因?yàn)榭吹讲簧倥笥言趯W(xué)習(xí)Spring Data JPA的過(guò)程中存在不同的困惑和難點(diǎn),所以我有了分享自身經(jīng)驗(yàn)、給人幫助的想法。 當(dāng)我們剛開(kāi)始學(xué)習(xí)Spring Data JPA的時(shí)候,往往都會(huì)直接去看它的官方文檔,但是很快就會(huì)發(fā)現(xiàn)其中的描述太過(guò)簡(jiǎn)單,經(jīng)常會(huì)讓人知其然而不知其所以然。有時(shí)候照著官方例子操作,發(fā)現(xiàn)有問(wèn)題卻又不知道錯(cuò)在哪里,這都是因?yàn)椴涣私馄渚韬捅澈蟮脑,所以不容易上手?/p> 而Spring Data JPA是對(duì)Hibernate的封裝和增強(qiáng),但由于之前國(guó)內(nèi)用Hibernate的人不是很多,導(dǎo)致中文資料特別少,而且大部分資料都是直接翻譯過(guò)來(lái)的,內(nèi)容松散、不成體系,無(wú)法讓人縱覽全局,導(dǎo)致我們對(duì)原理的掌握不是特別深刻。 當(dāng)我們遇到如Session、事務(wù)、LAZY異常等各種問(wèn)題時(shí),發(fā)現(xiàn)官網(wǎng)并沒(méi)有詳細(xì)的介紹,只能自己調(diào)試、硬啃源碼才能解決問(wèn)題。這時(shí)就需要花費(fèi)大量的時(shí)間來(lái)研究源碼,但又找不到可以參考的資料,而且不是每個(gè)公司都有大神愿意教你,此時(shí)是多么希望有一本書(shū)可以作為參考呀! 于是本書(shū)帶著多年的實(shí)戰(zhàn)經(jīng)驗(yàn)來(lái)了,在這里我想告訴你,其實(shí)Spring Data JPA不難,只要你靜下心來(lái)花時(shí)間研究,跟著本書(shū)的節(jié)奏,按順序?qū)W完,就會(huì)覺(jué)得這門(mén)技術(shù)原來(lái)如此簡(jiǎn)單,在解決實(shí)際問(wèn)題的時(shí)候也會(huì)游刃有余,你還會(huì)覺(jué)得JPA真的是被行業(yè)低估了! 【如何閱讀本書(shū)】 本書(shū)是我多年來(lái)的實(shí)踐經(jīng)驗(yàn)總結(jié),以語(yǔ)法 源碼 原理 實(shí)戰(zhàn)經(jīng)驗(yàn)的形式全面地介紹了Spring Data JPA,可以幫助你節(jié)省至少3年自己研究的時(shí)間,讓你真正掌握和發(fā)掘Spring Data JPA的實(shí)踐價(jià)值。 本書(shū)主要分為四個(gè)部分,共33章。 部分:基礎(chǔ)知識(shí)。從基本語(yǔ)法的視角,詳細(xì)介紹Spring Data JPA的語(yǔ)法糖有哪些,包括相關(guān)的源碼剖析、實(shí)際工作中的經(jīng)驗(yàn)分享等。涵蓋你在工作中會(huì)用到的Repository、Defining Query Methods(定義查詢(xún)方法)、@Query的語(yǔ)法,以及實(shí)體(Entity)的注解等內(nèi)容,幫助你全面掌握J(rèn)PA的基本用法。 第二部分:高階用法與實(shí)例。從實(shí)際工作中的復(fù)雜應(yīng)用場(chǎng)景開(kāi)始,為你講解Repository自定義場(chǎng)景、MVC參數(shù)的擴(kuò)展,以及數(shù)據(jù)源、事務(wù)、連接之間的關(guān)系等,幫助你解決實(shí)踐中可能遇到的問(wèn)題。 第三部分:原理在實(shí)戰(zhàn)中的應(yīng)用。掌握了基礎(chǔ)知識(shí)和復(fù)雜應(yīng)用場(chǎng)景后,再來(lái)了解其背后的原理,如Entity如何判斷Dirty、Entity在什么時(shí)機(jī)提交到數(shù)據(jù)庫(kù)、LAZY異常發(fā)生的原因、N 1SQL如何優(yōu)化等。針對(duì)實(shí)際工作中踩過(guò)的坑,為你講解解決思路和方法。 第四部分:思路擴(kuò)展。本書(shū)后從Spring Data Rest、測(cè)試用例、Spring Data ES、分庫(kù)分表的角度帶領(lǐng)大家擴(kuò)展思路,了解發(fā)展方向,因?yàn)檫@些內(nèi)容深挖了生態(tài)關(guān)系,可以為你打開(kāi)思路,更好地幫助你掌握前面所學(xué),做到舉一反三,同時(shí)也會(huì)大大提高你的開(kāi)發(fā)效率,使你開(kāi)發(fā)出的代碼質(zhì)量更有保障。當(dāng)你真正掌握了之后,就不會(huì)天天忙著救火,而是想著如何排除失火的隱患了。 張振華
1.1 Spring Boot和JPA演示 2 1.2 JPA如何整合MySQL數(shù)據(jù)庫(kù) 8 1.2.1 切換MySQL數(shù)據(jù)源 8 1.2.2 Spring Data JPA測(cè)試用例的寫(xiě)法 10 1.3 整體認(rèn)識(shí)JPA 11 1.3.1 市場(chǎng)上ORM框架的對(duì)比 11 1.3.2 JPA簡(jiǎn)介和開(kāi)源實(shí)現(xiàn) 12 1.4 認(rèn)識(shí)Spring Data 13 1.4.1 Spring Data簡(jiǎn)介 13 1.4.2 Spring Data的子項(xiàng)目 14 1.5 本章小結(jié) 15
2.1 Spring Data Commons的依賴(lài)關(guān)系 16 2.2 Repository接口 17 2.2.1 查看Repository源碼 17 2.2.2 Repository類(lèi)層次關(guān)系 17 2.2.3 Repository接口的實(shí)際案例 19 2.3 CrudRepository接口 21 2.4 PagingAndSortingRepository接口 23 2.4.1 PagingAndSortingRepository的源碼 23 2.4.2 PagingAndSortingRepository的使用案例 24 2.5 JpaRepository接口 25 2.6 Repository的實(shí)現(xiàn)類(lèi)SimpleJpaRepository 26 2.7 Repository接口的啟發(fā) 27 2.8 本章小結(jié) 28
3.1 定義查詢(xún)方法的配置和使用方法 29 3.1.1 直接通過(guò)方法名實(shí)現(xiàn)CRUD步驟 30 3.1.2 選擇性暴露CRUD方法 30 3.2 方法的查詢(xún)策略設(shè)置 31 3.3 定義查詢(xún)方法的語(yǔ)法 32 3.3.1 語(yǔ)法剖析 32 3.3.2 關(guān)鍵源碼 34 3.4 特定類(lèi)型的參數(shù):Sort和Pageable 36 3.5 限制查詢(xún)結(jié)果:First和Top 38 3.6 @NonNull、@NonNullApi和@Nullable關(guān)鍵字 38 3.7 給我們的一些思考 39 3.8 本章小結(jié) 43
4.1 Repository的返回結(jié)果 44 4.1.1 自定義Streamable 46 4.1.2 返回結(jié)果類(lèi)型List/Stream/Page/Slice 46 4.1.3 Repository對(duì)Feature/CompletableFuture異步返回結(jié)果的支持 52 4.1.4 對(duì)Reactive的支持:Flux與Mono 53 4.1.5 小結(jié) 53 4.2 常見(jiàn)的DTO返回結(jié)果的支持方法 56 4.2.1 Projections概念 56 4.2.2 種方法:新建一張表的不同Entity 57 4.2.3 第二種方法:直接定義一個(gè)UserOnlyNameEmailDto 58 4.2.4 第三種方法:返回結(jié)果是一個(gè)POJO的接口 60 4.2.5 寫(xiě)查詢(xún)方法的一個(gè)小技巧 62 4.3 本章小結(jié) 62
5.1 快速體驗(yàn)@Query的方法 63 5.2 JpaQueryLookupStrategy關(guān)鍵源碼剖析 64 5.3 @Query的基本用法 66 5.3.1 JPQL的語(yǔ)法 67 5.3.2 @Query的用法案例 68 5.3.3 @Query的排序 68 5.3.4 @Query的分頁(yè) 69 5.3.5 @Param的用法 70 5.4 @Query之Projections應(yīng)用返回指定DTO 70 5.4.1 利用UserDto類(lèi) 72 5.4.2 利用UserDto接口 73 5.5 @Query動(dòng)態(tài)查詢(xún)解決方法 74 5.6 本章小結(jié) 77
6.1 JPA協(xié)議中關(guān)于實(shí)體的相關(guān)規(guī)定 78 6.2 實(shí)體里面常見(jiàn)的注解 79 6.3 生成注解的小技巧 85 6.4 聯(lián)合主鍵 86 6.4.1 如何通過(guò)@IdClass實(shí)現(xiàn)聯(lián)合主鍵 86 6.4.2 @Embeddable與@EmbeddedId注解的使用 88 6.5 如何實(shí)現(xiàn)實(shí)體之間的繼承關(guān)系 89 6.5.1 @Inheritance(strategy?=?InheritanceType.SINGLE_TABLE) 90 6.5.2 @Inheritance(strategy?=?InheritanceType.JOINED) 91 6.5.3 @Inheritance(strategy?=?InheritanceType.TABLE_PER_CLASS) 93 6.5.4 關(guān)于繼承關(guān)系的經(jīng)驗(yàn)之談 94 6.6 本章小結(jié) 95
7.1 @OneToOne 96 7.1.1 @OneToOne的源碼解讀 98 7.1.2 mappedBy的注意事項(xiàng) 99 7.1.3 CascadeType的用法 99 7.1.4 orphanRemoval的屬性用法 100 7.1.5 主鍵和外鍵都是同一個(gè)字段 101 7.1.6 @OneToOne延遲加載下只需要ID值 102 7.1.7 @OneToOne的實(shí)踐 104 7.2 @JoinCloumns和@JoinColumn 105 7.3 @ManyToOne和@OneToMany 106 7.4 @ManyToMany 110 7.4.1 利用@ManyToOne和@OneToMany表達(dá)多對(duì)多的關(guān)聯(lián)關(guān)系 112 7.4.2 @ManyToMany的實(shí)踐 114 7.5 本章小結(jié) 114
8.1 Jackson的基本語(yǔ)法 115 8.1.1 三個(gè)核心模塊 116 8.1.2 Jackson提供的擴(kuò)展jar包 116 8.1.3 Jackson中常用的一些注解 117 8.1.4 實(shí)例 118 8.2 Jackson和Spring的關(guān)系 121 8.2.1 應(yīng)用場(chǎng)景一:Spring MVC的View層 121 8.2.2 應(yīng)用場(chǎng)景二:Open-Feign 121 8.2.3 應(yīng)用場(chǎng)景三:Redis里面 122 8.2.4 應(yīng)用場(chǎng)景四:JMS消息序列化 122 8.3 Jackson的原理分析 123 8.3.1 Jackson的可見(jiàn)性原理分析 123 8.3.2 反序列化重要的方法 124 8.3.3 Module的加載機(jī)制 126 8.4 Jackson與JPA常見(jiàn)的問(wèn)題 127 8.4.1 如何解決死循環(huán)問(wèn)題 127 8.4.2 JPA實(shí)體JSON序列化的常見(jiàn)報(bào)錯(cuò)及解決方法 128 8.4.3 推薦的配置項(xiàng) 129 8.4.4 JSON序列化和Java序列化 131 8.5 本章小結(jié) 131 【第二部分 高階用法與實(shí)例】
9.1 QueryByExampleExecutor的用法 135 9.1.1 基本方法 135 9.1.2 使用案例 136 9.2 QueryByExampleExecutor的語(yǔ)法 140 9.2.1 Example的語(yǔ)法詳解 140 9.2.2 ExampleMatcher方法概述 141 9.2.3 初始化ExampleMatcher實(shí)例的方法 142 9.2.4 ExampleMatcher的語(yǔ)法 143 9.2.5 ExampleMatcher的完整例子 145 9.2.6 使用QueryByExampleExecutor時(shí)需要考慮的因素 146 9.3 QueryByExampleExecutor的實(shí)現(xiàn)原理 146 9.3.1 QueryByExampleExecutor的源碼分析 146 9.3.2 JpaSpecificationExecutor的接口結(jié)構(gòu) 148 9.3.3 通過(guò)QBE反向思考JpaSpecificationExecutor 149 9.4 本章小結(jié) 149
10.1 JpaSpecificationExecutor的使用案例 150 10.2 JpaSpecificationExecutor的語(yǔ)法詳解 154 10.2.1 Root 10.2.2 CriteriaQuery> query 156 10.2.3 CriteriaBuilder 157 10.3 JpaSpecificationExecutor的原理分析 158 10.4 JpaSpecificationExecutor實(shí)戰(zhàn) 160 10.4.1 自定義MySpecification 161 10.4.2 利用Specification創(chuàng)建以search為查詢(xún)條件的RESTful API 163 10.5 本章小結(jié) 165
11.1 Querydsl快速入門(mén) 166 11.2 Querydsl的語(yǔ)法 170 11.2.1 QuerydslPredicateExecutor 170 11.2.2 QuerydslBinderCustomizer 172 11.2.3 類(lèi)型安全的應(yīng)用 174 11.3 Querydsl對(duì)WebMVC的支持 及源碼分析 175 11.3.1 @QuerydslPredicate注解 175 11.3.2 QuerydslPredicateArgument- Resolver源碼分析 177 11.4 本章小結(jié) 179
12.1 EntityManager簡(jiǎn)介 180 12.1.1 EntityManager的常用方法 180 12.1.2 EntityManager的使用 182 12.2 @EnableJpaRepositories詳解 183 12.2.1 @EnableJpaRepositories的語(yǔ)法 183 12.2.2 @EnableJpaRepositories的默認(rèn)加載方式 185 12.3 自定義Repository的實(shí)現(xiàn)類(lèi)的方法 186 12.3.1 種方法:定義獨(dú)立的Repository的Impl實(shí)現(xiàn)類(lèi) 186 12.3.2 種方法的原理分析 187 12.3.3 第二種方法:通過(guò)@EnableJpaRepositories定義默認(rèn)的實(shí)現(xiàn)類(lèi) 190 12.3.4 第二種方法的原理分析 192 12.4 實(shí)際應(yīng)用場(chǎng)景 193 12.5 本章小結(jié) 193
13.1 Auditing是什么 194 13.2 如何實(shí)現(xiàn)Auditing 195 13.2.1 種方式:直接在實(shí)例里面添加上述四個(gè)注解 195 13.2.2 第二種方式:在實(shí)體里面實(shí)現(xiàn)Auditable接口 198 13.2.3 第三種方式:利用@MappedSuperclass注解 200 13.3 JPA的Auditing功能解決了哪些問(wèn)題 201 13.4 Auditing的實(shí)現(xiàn)原理 202 13.4.1 Auditing的源碼分析 202 13.4.2 結(jié)論 204 13.5 本章小結(jié) 205
14.1 Java Persistence API規(guī)定的回調(diào)方法 206 14.1.1 Entity的回調(diào)事件注解 206 14.1.2 語(yǔ)法注意事項(xiàng) 207 14.2 JPA回調(diào)注解的使用方法 207 14.2.1 種用法:在實(shí)體和super-class中使用 207 14.2.2 第二種用法:自定義EntityListener 212 14.2.3 關(guān)于@EntityListeners加載順序的說(shuō)明 214 14.3 JPA回調(diào)注解的實(shí)踐 214 14.4 JPA回調(diào)注解的實(shí)現(xiàn)原理和事件機(jī)制 216 14.5 本章小結(jié) 217
15.1 什么是樂(lè)觀鎖 218 15.2 樂(lè)觀鎖的實(shí)現(xiàn)方法 218 15.2.1 @Version的用法 219 15.2.2 @Version對(duì)Save方法的影響 222 15.3 isNew判斷的邏輯 222 15.4 樂(lè)觀鎖機(jī)制和重試機(jī)制的實(shí)戰(zhàn) 224 15.4.1 重試機(jī)制詳解 224 15.4.2 @Retryable的詳細(xì)用法 225 15.4.3 樂(lè)觀鎖 重試機(jī)制的實(shí)踐 227 15.5 悲觀鎖的實(shí)現(xiàn) 227 15.6 本章小結(jié) 228
16.1 DomainClassConverter組件 230 16.1.1 一個(gè)實(shí)例 230 16.1.2 源碼分析 231 16.2 Page和Sort的參數(shù)支持 233 16.2.1 一個(gè)實(shí)例 233 16.2.2 原理分析 235 16.3 Web MVC的參數(shù)綁定 236 16.3.1 一個(gè)實(shí)例 237 16.3.2 原理分析 238 16.4 Querydsl的Web MVC支持 239 16.4.1 一個(gè)實(shí)例 239 16.4.2 原理分析 241 16.5 @DynamicUpdate和 @DynamicInsert詳解 242 16.5.1 通過(guò)語(yǔ)法快速了解 242 16.5.2 使用案例 243 16.5.3 只更新非Null的字段 246 16.5.4 @DynamicUpdate與@LastModifiedDate一起使用 248 16.6 Spring Data對(duì)系統(tǒng)監(jiān)控的支持 248 16.7 本章小結(jié) 249
17.1 Page和Sort參數(shù) 250 17.2 HandlerMethodArgumentResolver的用法 252 17.2.1 HandlerMethodArgument-Resolver詳解 252 17.2.2 與HttpMessageConverter的關(guān)系 254 17.2.3 HttpMessageConverter的執(zhí)行順序 254 17.3 HandlerMethodArgumentResolver實(shí)戰(zhàn) 255 17.3.1 自定義HandlerMethod-ArgumentResolver 256 17.3.2 實(shí)際工作中的四種常見(jiàn)場(chǎng)景 259 17.4 思路拓展 261 17.4.1 WebMvcConfigurer介紹 261 17.4.2 對(duì)JSON的返回結(jié)果進(jìn)行統(tǒng)一封裝 262 17.5 本章小結(jié) 264
18.1 數(shù)據(jù)源是什么 265 18.1.1 DataSource源碼分析 266 18.1.2 數(shù)據(jù)源、驅(qū)動(dòng)、連接和連接池的關(guān)系 268 18.2 數(shù)據(jù)源的加載原理和過(guò)程 269 18.2.1 DataSourceAutoConfiguration數(shù)據(jù)源的加載過(guò)程分析 269 18.2.2 Hikari數(shù)據(jù)源下的MySQL配置實(shí)踐 274 18.2.3 Hikari數(shù)據(jù)通過(guò)Prometheus的監(jiān)控指標(biāo)應(yīng)用 276 18.3 AliDruidDataSource的配置與介紹 278 18.4 命名策略詳解及其實(shí)踐 279 18.4.1 Hibernate 5的命名策略 279 18.4.2 加載原理與自定義方法 282 18.4.3 實(shí)際應(yīng)用場(chǎng)景 283 18.5 數(shù)據(jù)庫(kù)的時(shí)區(qū)問(wèn)題 283 18.5.1 MySQL時(shí)間類(lèi)型字段和時(shí)區(qū)的關(guān)系 283 18.5.2 MySQL驅(qū)動(dòng)處理時(shí)區(qū)的原理 285 18.6 本章小結(jié) 286
19.1 種方式:@Configuration配置方法 287 19.1.1 通過(guò)多個(gè)@Configuration的配置方法 287 19.1.2 DataSource與Transaction-Manager、EntityManager-Factory的關(guān)系分析 294 19.1.3 默認(rèn)的JpaBaseConfiguration的加載方式分析 294 19.2 第二種方式:利用Abstract-RoutingDataSource配置 295 19.2.1 利用AbstractRoutingData-Source的配置方法 296 19.2.2 微服務(wù)下多數(shù)據(jù)源的思考 299 19.2.3 微服務(wù)下的實(shí)戰(zhàn)建議 300 19.3 本章小結(jié) 300
20.1 事務(wù)的基本原理 301 20.1.1 四種MySQL事務(wù)的隔離級(jí)別 302 20.1.2 MySQL中事務(wù)與連接的關(guān)系 303 20.2 Spring事務(wù)的配置方法 304 20.2.1 默認(rèn)@Transactional注解式事務(wù) 305 20.2.2 @Transactional的局限性 307 20.2.3 TransactionTemplate的用法 308 20.2.4 自定義TransactionHelper 310 20.2.5 AspectJ事務(wù)配置 310 20.2.6 通過(guò)日志分析配置方法的過(guò)程 311 20.3 Spring事務(wù)的實(shí)現(xiàn)原理 313 20.3.1 Spring事務(wù)源碼分析 313 20.3.2 事務(wù)和連接池在JPA中的注意事項(xiàng) 318 20.4 本章小結(jié) 318 【第三部分 原理在實(shí)戰(zhàn)中的應(yīng)用】
21.1 Hibernate架構(gòu)分析 320 21.2 Hibernate 5在Spring Boot 2中的加載過(guò)程 321 21.2.1 JpaProperties屬性 322 21.2.2 HibernateJpaConfiguration分析 323 21.2.3 自動(dòng)加載過(guò)程類(lèi)之間的關(guān)系 328 21.3 Repositories的加載模式 329 21.4 在調(diào)試時(shí)需要的日志配置 331 21.5 本章小結(jié) 333
22.1 Persistence Context相關(guān)核心概念 334 22.1.1 EntityManagerFactory和Persistence Unit 334 22.1.2 EntityManager和PersistenceContext 335 22.2 實(shí)體對(duì)象的生命周期 337 22.2.1 種:New狀態(tài) 337 22.2.2 第二種:Detached狀態(tài) 338 22.2.3 第三種:Managed狀態(tài) 339 22.2.4 第四種:Removed狀態(tài) 339 22.3 解密EntityManager的f?lush()方法 340 22.3.1 Flush的作用 340 22.3.2 Flush機(jī)制 341 22.3.3 Flush會(huì)改變SQL的執(zhí)行順序 342 22.3.4 Flush與事務(wù)提交的關(guān)系 343 22.3.5 Flush與樂(lè)觀鎖的關(guān)系 344 22.3.6 saveAndFlush和save的區(qū)別 345 22.4 Dirty判斷邏輯及其作用 346 22.4.1 Dirty效果的例子 346 22.4.2 Entity判斷Dirty的過(guò)程 346 22.5 本章小結(jié) 347
23.1 Session是什么 348 23.1.1 對(duì)Session的理解 348 23.1.2 SessionImpl解決了什么問(wèn)題 349 23.2 open-in-view是做什么的 350 23.2.1 open-in-view的作用 350 23.2.2 OpenEntityManagerInView-Interceptor源碼分析 351 23.2.3 EntityManager的開(kāi)啟時(shí)機(jī)及擴(kuò)展場(chǎng)景 353 23.2.4 驗(yàn)證EntityManager創(chuàng)建和釋放的日志 354 23.3 hibernate.connection.handling_mode詳解 356 23.3.1 PhysicalConnectionHandling-Mode的五種模式 356 23.3.2 默認(rèn)模式及其修改 358 23.3.3 handling_mode的配置對(duì)連接的影響 359 23.4 Session、EntityManager、Connection和Transaction之間的關(guān)系 361 23.4.1 Connection和Transaction 361 23.4.2 EntityManager、Connection和Transaction 362 23.4.3 Session、EntityManager、Connection和Transaction 362 23.4.4 Session和Transaction 362 23.5 本章小結(jié) 362
24.1 CompletableFuture的實(shí)際使用案例 363 24.1.1 CompletableFuture的常見(jiàn)寫(xiě)法 363 24.1.2 案例中表現(xiàn)出來(lái)的問(wèn)題現(xiàn)狀 364 24.2 異步方法步驟拆解 365 24.2.1 CompletableFuture實(shí)踐 365 24.2.2 通過(guò)日志查看事務(wù)的執(zhí)行過(guò)程 367 24.2.3 異步事務(wù)的正確使用方法 369 24.2.4 Session機(jī)制與Repository.save(entity)的關(guān)系 372 24.3 異步場(chǎng)景下的思考 374 24.4 本章小結(jié) 375
25.1 什么是LazyInitialization-Exception 376 25.2 LAZY加載機(jī)制的原理分析 378 25.2.1 PersistentCollection集合類(lèi) 378 25.2.2 以PersistentBag為例詳解原理 379 25.3 LAZY異常的常見(jiàn)場(chǎng)景與解決方法 382 25.3.1 場(chǎng)景一:跨事務(wù)或事務(wù)之外 382 25.3.2 場(chǎng)景二:異步線(xiàn)程 384 25.3.3 場(chǎng)景三:Controller直接返回實(shí)體 384 25.3.4 場(chǎng)景四:自定義的攔截器和Filter中無(wú)意的toString操作 385 25.4 hibernate.enable_lazy_load_no_trans配置 386 25.5 Javax.persistence.Persistence-Exception異常類(lèi)型 386 25.6 本章小結(jié) 387
26.1 什么是N 1SQL問(wèn)題 388 26.2 減少N對(duì)應(yīng)的SQL語(yǔ)句的條數(shù) 393 26.2.1 hibernate.default_batch_fetch_size配置 393 26.2.2 @BatchSize注解 395 26.3 Hibernate中獲取數(shù)據(jù)的策略 399 26.3.1 FetchMode.SELECT 399 26.3.2 FetchMode.JOIN 401 26.3.3 FetchMode.SUBSELECT 403 26.4 轉(zhuǎn)變解決問(wèn)題的思路 405 26.5 @NamedEntityGraph和@EntityGraph使用詳解 406 26.5.1 @NamedEntityGraph和@EntityGraph的用法 407 26.5.2 @NamedEntityGraph和@EntityGraph使用實(shí)例 409 26.6 本章小結(jié) 412
27.1 SpEL基礎(chǔ) 413 27.1.1 SpEL的主要語(yǔ)法 413 27.1.2 SpEL的基本用法 415 27.2 SpEL在Spring中的常見(jiàn)使用場(chǎng)景 416 27.2.1 @Value中的應(yīng)用場(chǎng)景 416 27.2.2 @Query中的應(yīng)用場(chǎng)景 422 27.2.3 @Cacheable中的應(yīng)用場(chǎng)景 425 27.3 本章小結(jié) 427
28.1 一級(jí)緩存 428 28.1.1 什么是一級(jí)緩存 428 28.1.2 一級(jí)緩存的作用 429 28.2 QueryPlanCache 432 28.2.1 QueryPlanCache是什么 432 28.2.2 QueryPlanCache存儲(chǔ)的內(nèi)容 433 28.2.3 QueryPlanCache和Session的關(guān)系 436 28.3 QueryPlanCache中In查詢(xún)條件引發(fā)的內(nèi)存泄漏問(wèn)題 438 28.3.1 In查詢(xún)條件引發(fā)內(nèi)存泄漏的原因 438 28.3.2 解決In查詢(xún)條件內(nèi)存泄漏的方法 440 28.4 本章小結(jié) 441 【第四部分 思路擴(kuò)展】
29.1 二級(jí)緩存的概念 444 29.1.1 Hibernate中二級(jí)緩存的配置方法 444 29.1.2 二級(jí)緩存的思考 445 29.2 利用Redis進(jìn)行緩存 446 29.2.1 Spring Cache和Redis的結(jié)合 446 29.2.2 介紹Spring Cache 447 29.2.3 Spring Cache的主要注解 447 29.2.4 Spring Cache Redis的主要類(lèi) 449 29.3 Spring Cache結(jié)合Redis的實(shí)踐 451 29.3.1 不同Cache name配置不同的過(guò)期時(shí)間 451 29.3.2 自定義Redis key的拼接規(guī)則 453 29.3.3 異常時(shí)不要阻礙主流程 454 29.3.4 改變默認(rèn)的Cache中Redis的value序列化方式 455 29.4 本章小結(jié) 457
30.1 Spring Data Rest Demo 458 30.2 Spring Data Rest的基本用法 461 30.2.1 語(yǔ)義化的方法 461 30.2.2 默認(rèn)的狀態(tài)碼支持 462 30.2.3 分頁(yè)支持 462 30.2.4 通過(guò)@RepositoryRest-Resource改變資源的metaData 462 30.2.5 利用@RestResource改變RESTful的SearchPath 464 30.2.6 Spring Data Rest的配置項(xiàng)支持 465 30.3 返回結(jié)果對(duì)Jackson的支持 466 30.4 Spring Data Rest和Spring Data JPA的關(guān)系 467 30.5 本章小結(jié) 467
31.1 Spring Data JPA單元測(cè)試的實(shí)踐 468 31.1.1 Spring Data JPA Repository的測(cè)試用例 468 31.1.2 Repository的測(cè)試場(chǎng)景 470 31.2 什么是單元測(cè)試 473 31.2.1 Service層單元測(cè)試 473 31.2.2 Controller層單元測(cè)試 475 31.3 什么是集成測(cè)試 477 31.3.1 Service層的集成測(cè)試用例寫(xiě)法 477 31.3.2 Controller層的集成測(cè)試用例寫(xiě)法 478 31.3.3 集成測(cè)試的一些思考 479 31.4 JUnit 4和JUnit 5在Spring Boot中的區(qū)別 481 31.5 本章小結(jié) 482
32.1 Spring Data ElasticSearch入門(mén)案例 483 32.2 Spring Data ElasticSearch中的關(guān)鍵類(lèi) 491 32.3 ESRepository和JPARepository同時(shí)存在 492 32.4 本章小結(jié) 495
33.1 Sharding-JDBC簡(jiǎn)介 496 33.2 在JPA中利用Sharding-JDBC拆表 497 33.2.1 利用JPA拆分256個(gè)表的使用案例 497 33.2.2 實(shí)際集成過(guò)程中可能產(chǎn)生的問(wèn)題 503 33.2.3 Sharding-JDBC簡(jiǎn)單原理分析 503 33.3 分庫(kù)的思考 505 33.3.1 垂直拆分還是水平拆分 505 33.3.2 微服務(wù)還是多數(shù)據(jù)庫(kù) 506 33.3.3 讀寫(xiě)分離還是多讀多寫(xiě) 506 33.3.4 分布式事務(wù)如何處理 506 33.4 本章小結(jié) 507 結(jié)束語(yǔ) 師傅領(lǐng)進(jìn)門(mén),修行靠個(gè)人 508
你還可能感興趣
我要評(píng)論
|