關(guān)于我們
書單推薦
新書推薦
|
Spring Data JPA:入門、實(shí)戰(zhàn)與進(jìn)階 本書是作者多年來的經(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à)值。 【本書共 33章,主要分為四部分】 (1)資深架構(gòu)師多年一線JPA開發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié),資深專家多年經(jīng)驗(yàn)總結(jié),從入門到精通,從原理到實(shí)戰(zhàn),深入淺出地完整掌握Spring Data JPA,從而提升開發(fā)效率。 適讀人群: (1)有一定開發(fā)經(jīng)驗(yàn),想系統(tǒng)地學(xué)習(xí) JPA 技術(shù); (2)需要掌握分布式經(jīng)驗(yàn)和原理的資深Java 開發(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)師、開發(fā)主管等職務(wù)。在工作期間,我既負(fù)責(zé)過后端服務(wù)的平臺(tái)架構(gòu),也實(shí)現(xiàn)過微服務(wù)的升級(jí),同時(shí)還寫過公司的很多核心框架,遇到過很多人都會(huì)遇到的常見問題,積累并總結(jié)了一些可以復(fù)用和遷移的寶貴經(jīng)驗(yàn)。 【我是如何學(xué)習(xí)Spring Data JPA的】 大概四五年前,公司入職了一批架構(gòu)師,他們引入了Spring Data JPA框架。起初接觸這個(gè)框架時(shí)我的確很排斥,心想,這么復(fù)雜的框架真不如MyBatis簡(jiǎn)單隨便寫個(gè)簡(jiǎn)單的SQL就好了,為什么要學(xué)習(xí)JPA呢?而且還要學(xué)習(xí)一大堆相關(guān)聯(lián)的東西(比如要了解Session原理),這么復(fù)雜,它有什么好處呢?加上那時(shí)候我對(duì)JPA框架的理解不是很深入,也沒有研究其背后的原理,寫的代碼常常會(huì)有各種Bug…… 但冷靜下來之后,我才意識(shí)到其實(shí)是自己一直待在所謂的舒適區(qū)的緣故,既然公司的資深架構(gòu)師們引入了這門技術(shù),那它肯定是有好處的,不如就先用著,只有掌握了這門技術(shù)才能知道它到底好不好。既然是做技術(shù)的,總要有點(diǎn)追求,有點(diǎn)極客精神,否則很容易跟不上技術(shù)發(fā)展的速度和時(shí)代發(fā)展的潮流。 于是,我決定潛心研究一番。而那時(shí)候,資深架構(gòu)師只負(fù)責(zé)引入Spring Data JPA技術(shù),不負(fù)責(zé)講解其使用原理,自己摸索起來比較吃力,我確實(shí)也走了不少?gòu)澛。一開始只掌握Spring Data JPA的基本用法時(shí)我就遇到了一些問題(比如一個(gè)常見的動(dòng)態(tài)SQL問題),由于研究得不太多,用起來別別扭扭的,雖然功能實(shí)現(xiàn)了,但總感覺不是實(shí)踐,反而降低了開發(fā)效率。 后來我通過參考官方文檔,以及網(wǎng)上搜索的零星資料,逐漸掌握了一些高級(jí)用法。但在遇到一些復(fù)雜的場(chǎng)景,如在多線程、高并發(fā)情況下出現(xiàn)問題時(shí),依然弄不明白是怎么回事。這時(shí)我發(fā)現(xiàn)JPA協(xié)議的實(shí)現(xiàn)者是Hibernate,于是我又讀了Hibernate的文檔,發(fā)現(xiàn)Hibernate已經(jīng)發(fā)展好幾代了,遠(yuǎn)不像我們之前想的那么復(fù)雜,這才了解了一些基本原理。懂得了原理之后,就基本可以解決很多異常問題了。 隨著自己對(duì)JPA的使用越來越熟練,Bug沒有那么多了,開發(fā)效率確實(shí)提升了,而且我明顯感覺自己的技術(shù)能力也提升了很多,如對(duì)Session、事務(wù)、連接池的理解更深入了。同時(shí)我發(fā)現(xiàn)Spring Data JPA框架里面有很多優(yōu)秀的思想,比如樂觀鎖的處理、分頁(yè)和排序的統(tǒng)一處理、語(yǔ)義化的方法名、動(dòng)態(tài)代理、策略模式等,這些都可以作為我們自己寫框架時(shí)的知識(shí)儲(chǔ)備,值得我們學(xué)習(xí)和借鑒。 為了讓自己更加熟悉這門技術(shù),也為了避免在工作中給別人講解時(shí)誤導(dǎo)他人,后來我抽時(shí)間看了官方的Java Persistence API約定和規(guī)范,又找了一些業(yè)內(nèi)的專家進(jìn)行溝通與討論,知道了Hibernate的哪些設(shè)計(jì)比較好、哪些設(shè)計(jì)不好,以及我們?cè)趯?shí)際開發(fā)中好避免使用的技術(shù)點(diǎn)。 再后來我為了一探究竟,自己就抽空寫文章、寫書,然后利用簡(jiǎn)單的案例來調(diào)試Spring Data JPA的源碼,思考為什么會(huì)有這種語(yǔ)法、具體是怎么寫的。通過這一系列的操作,我又收獲了運(yùn)行原理和用法的實(shí)踐。 這些經(jīng)驗(yàn)都讓我在技術(shù)層面得到了提升,隨后通過在公司內(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開發(fā)者的視野,大量嘗鮮者享受到了這門技術(shù)帶來的便利。JPA可以使團(tuán)隊(duì)在框架約定下進(jìn)行開發(fā),很少出現(xiàn)有性能瓶頸的SQL。因此不難發(fā)現(xiàn)很多大公司,如阿里、騰訊、抖音等,近幾年在招聘的時(shí)候都會(huì)寫明要熟悉JPA,這些大公司以及業(yè)內(nèi)很多開源的新項(xiàng)目也都在使用JPA。 第二,提升開發(fā)效率,F(xiàn)在很多人都知道Spring Data JPA是什么,但是覺得JPA很難用,使用中發(fā)現(xiàn)Bug后不知道原因。本來用JPA是為了提升開發(fā)效率,不會(huì)使用反倒容易踩很多坑,所以我們需要系統(tǒng)地學(xué)習(xí)它。當(dāng)你遇到復(fù)雜問題時(shí),比如,平時(shí)你可能需要花幾個(gè)小時(shí)想方法名、SQL邏輯,如果可以熟練地使用JPA,那么半小時(shí)甚至幾分鐘就可以寫好查詢方法了,再配合測(cè)試用例,你的開發(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)系,這樣一來,就可以清楚地知道JPA的重要作用和脈絡(luò)了。 第四,求職加分項(xiàng)。如果簡(jiǎn)歷中突出Spring Data JPA框架的使用,會(huì)讓面試官眼前一亮。因?yàn)檎莆樟薐PA,就意味著掌握了很多原理,如Session原理、事務(wù)原理、PersistenceContext原理等,而掌握了底層原理對(duì)于技術(shù)人員來說可以在開發(fā)中解決很多問題。因此,公司可以由此更好地過濾和篩選人才,也能從側(cè)面看出求職者是否對(duì)技術(shù)足夠感興趣。我認(rèn)為未來3~5年,使用Spring Data JPA的人會(huì)越來越多,你可以在拉勾招聘網(wǎng)站上看到,很多招聘信息都會(huì)要求熟練掌握Spring Data JPA。 【為什么要寫這本書】 因?yàn)槲易约航?jīng)歷了上述曲折的實(shí)踐,還因?yàn)榭吹讲簧倥笥言趯W(xué)習(xí)Spring Data JPA的過程中存在不同的困惑和難點(diǎn),所以我有了分享自身經(jīng)驗(yàn)、給人幫助的想法。 當(dāng)我們剛開始學(xué)習(xí)Spring Data JPA的時(shí)候,往往都會(huì)直接去看它的官方文檔,但是很快就會(huì)發(fā)現(xiàn)其中的描述太過簡(jiǎn)單,經(jīng)常會(huì)讓人知其然而不知其所以然。有時(shí)候照著官方例子操作,發(fā)現(xiàn)有問題卻又不知道錯(cuò)在哪里,這都是因?yàn)椴涣私馄渚韬捅澈蟮脑,所以不容易上手?/p> 而Spring Data JPA是對(duì)Hibernate的封裝和增強(qiáng),但由于之前國(guó)內(nèi)用Hibernate的人不是很多,導(dǎo)致中文資料特別少,而且大部分資料都是直接翻譯過來的,內(nèi)容松散、不成體系,無法讓人縱覽全局,導(dǎo)致我們對(duì)原理的掌握不是特別深刻。 當(dāng)我們遇到如Session、事務(wù)、LAZY異常等各種問題時(shí),發(fā)現(xiàn)官網(wǎng)并沒有詳細(xì)的介紹,只能自己調(diào)試、硬啃源碼才能解決問題。這時(shí)就需要花費(fèi)大量的時(shí)間來研究源碼,但又找不到可以參考的資料,而且不是每個(gè)公司都有大神愿意教你,此時(shí)是多么希望有一本書可以作為參考呀! 于是本書帶著多年的實(shí)戰(zhàn)經(jīng)驗(yàn)來了,在這里我想告訴你,其實(shí)Spring Data JPA不難,只要你靜下心來花時(shí)間研究,跟著本書的節(jié)奏,按順序?qū)W完,就會(huì)覺得這門技術(shù)原來如此簡(jiǎn)單,在解決實(shí)際問題的時(shí)候也會(huì)游刃有余,你還會(huì)覺得JPA真的是被行業(yè)低估了! 【如何閱讀本書】 本書是我多年來的實(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à)值。 本書主要分為四個(gè)部分,共33章。 部分:基礎(chǔ)知識(shí)。從基本語(yǔ)法的視角,詳細(xì)介紹Spring Data JPA的語(yǔ)法糖有哪些,包括相關(guān)的源碼剖析、實(shí)際工作中的經(jīng)驗(yàn)分享等。涵蓋你在工作中會(huì)用到的Repository、Defining Query Methods(定義查詢方法)、@Query的語(yǔ)法,以及實(shí)體(Entity)的注解等內(nèi)容,幫助你全面掌握J(rèn)PA的基本用法。 第二部分:高階用法與實(shí)例。從實(shí)際工作中的復(fù)雜應(yīng)用場(chǎng)景開始,為你講解Repository自定義場(chǎng)景、MVC參數(shù)的擴(kuò)展,以及數(shù)據(jù)源、事務(wù)、連接之間的關(guān)系等,幫助你解決實(shí)踐中可能遇到的問題。 第三部分:原理在實(shí)戰(zhàn)中的應(yīng)用。掌握了基礎(chǔ)知識(shí)和復(fù)雜應(yīng)用場(chǎng)景后,再來了解其背后的原理,如Entity如何判斷Dirty、Entity在什么時(shí)機(jī)提交到數(shù)據(jù)庫(kù)、LAZY異常發(fā)生的原因、N 1SQL如何優(yōu)化等。針對(duì)實(shí)際工作中踩過的坑,為你講解解決思路和方法。 第四部分:思路擴(kuò)展。本書后從Spring Data Rest、測(cè)試用例、Spring Data ES、分庫(kù)分表的角度帶領(lǐng)大家擴(kuò)展思路,了解發(fā)展方向,因?yàn)檫@些內(nèi)容深挖了生態(tài)關(guān)系,可以為你打開思路,更好地幫助你掌握前面所學(xué),做到舉一反三,同時(shí)也會(huì)大大提高你的開發(fā)效率,使你開發(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è)試用例的寫法 10 1.3 整體認(rèn)識(shí)JPA 11 1.3.1 市場(chǎng)上ORM框架的對(duì)比 11 1.3.2 JPA簡(jiǎn)介和開源實(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的依賴關(guān)系 16 2.2 Repository接口 17 2.2.1 查看Repository源碼 17 2.2.2 Repository類層次關(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)類SimpleJpaRepository 26 2.7 Repository接口的啟發(fā) 27 2.8 本章小結(jié) 28
3.1 定義查詢方法的配置和使用方法 29 3.1.1 直接通過方法名實(shí)現(xiàn)CRUD步驟 30 3.1.2 選擇性暴露CRUD方法 30 3.2 方法的查詢策略設(shè)置 31 3.3 定義查詢方法的語(yǔ)法 32 3.3.1 語(yǔ)法剖析 32 3.3.2 關(guān)鍵源碼 34 3.4 特定類型的參數(shù):Sort和Pageable 36 3.5 限制查詢結(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é)果類型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 常見的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 寫查詢方法的一個(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類 72 5.4.2 利用UserDto接口 73 5.5 @Query動(dòng)態(tài)查詢解決方法 74 5.6 本章小結(jié) 77
6.1 JPA協(xié)議中關(guān)于實(shí)體的相關(guān)規(guī)定 78 6.2 實(shí)體里面常見的注解 79 6.3 生成注解的小技巧 85 6.4 聯(lián)合主鍵 86 6.4.1 如何通過@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的可見性原理分析 123 8.3.2 反序列化重要的方法 124 8.3.3 Module的加載機(jī)制 126 8.4 Jackson與JPA常見的問題 127 8.4.1 如何解決死循環(huán)問題 127 8.4.2 JPA實(shí)體JSON序列化的常見報(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 通過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為查詢條件的RESTful API 163 10.5 本章小結(jié) 165
11.1 Querydsl快速入門 166 11.2 Querydsl的語(yǔ)法 170 11.2.1 QuerydslPredicateExecutor 170 11.2.2 QuerydslBinderCustomizer 172 11.2.3 類型安全的應(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)類的方法 186 12.3.1 種方法:定義獨(dú)立的Repository的Impl實(shí)現(xiàn)類 186 12.3.2 種方法的原理分析 187 12.3.3 第二種方法:通過@EnableJpaRepositories定義默認(rèn)的實(shí)現(xiàn)類 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功能解決了哪些問題 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加載順序的說明 214 14.3 JPA回調(diào)注解的實(shí)踐 214 14.4 JPA回調(diào)注解的實(shí)現(xiàn)原理和事件機(jī)制 216 14.5 本章小結(jié) 217
15.1 什么是樂觀鎖 218 15.2 樂觀鎖的實(shí)現(xiàn)方法 218 15.2.1 @Version的用法 219 15.2.2 @Version對(duì)Save方法的影響 222 15.3 isNew判斷的邏輯 222 15.4 樂觀鎖機(jī)制和重試機(jī)制的實(shí)戰(zhàn) 224 15.4.1 重試機(jī)制詳解 224 15.4.2 @Retryable的詳細(xì)用法 225 15.4.3 樂觀鎖 重試機(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 通過語(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í)際工作中的四種常見場(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ù)源的加載原理和過程 269 18.2.1 DataSourceAutoConfiguration數(shù)據(jù)源的加載過程分析 269 18.2.2 Hikari數(shù)據(jù)源下的MySQL配置實(shí)踐 274 18.2.3 Hikari數(shù)據(jù)通過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ū)問題 283 18.5.1 MySQL時(shí)間類型字段和時(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 通過多個(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 通過日志分析配置方法的過程 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中的加載過程 321 21.2.1 JpaProperties屬性 322 21.2.2 HibernateJpaConfiguration分析 323 21.2.3 自動(dòng)加載過程類之間的關(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與樂觀鎖的關(guān)系 344 22.3.6 saveAndFlush和save的區(qū)別 345 22.4 Dirty判斷邏輯及其作用 346 22.4.1 Dirty效果的例子 346 22.4.2 Entity判斷Dirty的過程 346 22.5 本章小結(jié) 347
23.1 Session是什么 348 23.1.1 對(duì)Session的理解 348 23.1.2 SessionImpl解決了什么問題 349 23.2 open-in-view是做什么的 350 23.2.1 open-in-view的作用 350 23.2.2 OpenEntityManagerInView-Interceptor源碼分析 351 23.2.3 EntityManager的開啟時(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的常見寫法 363 24.1.2 案例中表現(xiàn)出來的問題現(xiàn)狀 364 24.2 異步方法步驟拆解 365 24.2.1 CompletableFuture實(shí)踐 365 24.2.2 通過日志查看事務(wù)的執(zhí)行過程 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集合類 378 25.2.2 以PersistentBag為例詳解原理 379 25.3 LAZY異常的常見場(chǎng)景與解決方法 382 25.3.1 場(chǎng)景一:跨事務(wù)或事務(wù)之外 382 25.3.2 場(chǎng)景二:異步線程 384 25.3.3 場(chǎng)景三:Controller直接返回實(shí)體 384 25.3.4 場(chǎng)景四:自定義的攔截器和Filter中無意的toString操作 385 25.4 hibernate.enable_lazy_load_no_trans配置 386 25.5 Javax.persistence.Persistence-Exception異常類型 386 25.6 本章小結(jié) 387
26.1 什么是N 1SQL問題 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)變解決問題的思路 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中的常見使用場(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查詢條件引發(fā)的內(nèi)存泄漏問題 438 28.3.1 In查詢條件引發(fā)內(nèi)存泄漏的原因 438 28.3.2 解決In查詢條件內(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的主要類 449 29.3 Spring Cache結(jié)合Redis的實(shí)踐 451 29.3.1 不同Cache name配置不同的過期時(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 通過@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è)試用例寫法 477 31.3.2 Controller層的集成測(cè)試用例寫法 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入門案例 483 32.2 Spring Data ElasticSearch中的關(guān)鍵類 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í)際集成過程中可能產(chǎ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 讀寫分離還是多讀多寫 506 33.3.4 分布式事務(wù)如何處理 506 33.4 本章小結(jié) 507 結(jié)束語(yǔ) 師傅領(lǐng)進(jìn)門,修行靠個(gè)人 508
你還可能感興趣
我要評(píng)論
|