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