首页>参考读物>计算机科学与技术>软件与程序设计

Spring Data JPA:入门、实战与进阶
作者 : 张振华 著
丛书名 : 华章程序员书库
出版日期 : 2021-10-21
ISBN : 978-7-111-69220-1
定价 : 129.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 527
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书主要分为四个模块,共33章。
模块一主要从基本语法的视角,来详细介绍 Spring Data JPA 的语法糖有哪些,包括源码的剖析、实际工作中的经验分享,以及作者对此的思考、启发。模块二从实际工作中的复杂应用场景开始,依次讲解自定义场景,如何扩展 Spring 给我们提供的框架、数据源、连接、事务之间的关系,帮助读者解决实践中可能会遇到的问题,并学会独立思考、稳妥解决。模块三讲解了实际工作遇到的经典问题,如 N+1 sql、lazy、事务的问题,及作者对此的思考和解决思路。模块四从 Spring Data Rest、Spring Data ES、测试用例的角度,扩展思路,展望一下发展方向。

图书特色

资深Java研发工程师和架构师多年工作经验总结,从原理、应用和实践3个维度展开
从基础知识到高级用法,从高级用法到实战经验,从实战经验到原理分析
从实际遇到的问题到如何利用背后原理解决问题,多维度全面深入地讲解Spring Data JPA技术栈

图书前言

勇敢地走出舒适区,突破自己的技术瓶颈
你好,我是张振华,在Java领域从业已有十几年,也算是一个“Java老兵”了,我曾先后在驴妈妈、携程等互联网公司担任Java架构师、开发主管等职务。在工作期间,我既负责过后端服务的平台架构,也实现过微服务的升级,同时还写过公司的很多核心框架,遇到过很多人都会遇到的常见问题,积累并总结了一些可以复用和迁移的宝贵经验。
我是如何学习Spring Data JPA的
大概四五年前,公司入职了一批架构师,他们引入了Spring Data JPA框架。起初接触这个框架时我的确很排斥,心想,这么复杂的框架真不如MyBatis简单—随便写个简单的SQL就好了,为什么要学习JPA呢?而且还要学习一大堆相关联的东西(比如要了解Session原理),这么复杂,它有什么好处呢?加上那时候我对JPA框架的理解不是很深入,也没有研究其背后的原理,写的代码常常会有各种Bug……
但冷静下来之后,我才意识到其实是自己一直待在所谓的舒适区的缘故,既然公司的资深架构师们引入了这门技术,那它肯定是有好处的,不如就先用着,只有掌握了这门技术才能知道它到底好不好。既然是做技术的,总要有点追求,有点极客精神,否则很容易跟不上技术发展的速度和时代发展的潮流。
于是,我决定潜心研究一番。而那时候,资深架构师只负责引入Spring Data JPA技术,不负责讲解其使用原理,自己摸索起来比较吃力,我确实也走了不少弯路。一开始只掌握Spring Data JPA的基本用法时我就遇到了一些问题(比如一个最常见的动态SQL问题),由于研究得不太多,用起来别别扭扭的,虽然功能实现了,但总感觉不是最佳实践,反而降低了开发效率。
后来我通过参考官方文档,以及网上搜索的零星资料,逐渐掌握了一些高级用法。但在遇到一些复杂的场景,如在多线程、高并发情况下出现问题时,依然弄不明白是怎么回事。这时我发现JPA协议的最佳实现者是Hibernate,于是我又读了Hibernate的文档,发现Hibernate已经发展好几代了,远不像我们之前想的那么复杂,这才了解了一些基本原理。懂得了原理之后,就基本可以解决很多异常问题了。
随着自己对JPA的使用越来越熟练,Bug没有那么多了,开发效率确实提升了,而且我明显感觉自己的技术能力也提升了很多,如对Session、事务、连接池的理解更深入了。同时我发现Spring Data JPA框架里面有很多优秀的思想,比如乐观锁的处理、分页和排序的统一处理、语义化的方法名、动态代理、策略模式等,这些都可以作为我们自己写框架时的知识储备,值得我们学习和借鉴。
为了让自己更加熟悉这门技术,也为了避免在工作中给别人讲解时误导他人,后来我抽时间看了官方的Java Persistence API约定和规范,又找了一些业内的专家进行沟通与讨论,知道了Hibernate的哪些设计比较好、哪些设计不好,以及我们在实际开发中最好避免使用的技术点。
再后来我为了一探究竟,自己就抽空写文章、写书,然后利用简单的案例来调试Spring Data JPA的源码,思考为什么会有这种语法、具体是怎么写的。通过这一系列的操作,我又收获了运行原理和用法的最佳实践。
这些经验都让我在技术层面得到了提升,随后通过在公司内部的分享,也让身边的同事眼前一亮,并顺利实现了公司框架的升级,个人也顺利地实现升职和加薪。因为我在其中真正受益了,所以就想把自己的这种经历和经验系统整理后分享给你,希望可以帮助你少走一些弯路。
Spring Data JPA的优势
至今,我所在公司的大部分项目都在用Spring Data JPA,究其原因,我认为主要是它具有以下四点优势。
第一,大势所趋,大公司必备技能。近两年由于Spring Cloud、Spring Boot逐渐统一Java框架江湖,而与Spring Boot天然集成的Spring Data JPA也逐渐走进了Java开发者的视野,大量“尝鲜者”享受到了这门技术带来的便利。JPA可以使团队在框架约定下进行开发,很少出现有性能瓶颈的SQL。因此不难发现很多大公司,如阿里、腾讯、抖音等,近几年在招聘的时候都会写明要熟悉JPA,这些大公司以及业内很多开源的新项目也都在使用JPA。
第二,提升开发效率。现在很多人都知道Spring Data JPA是什么,但是觉得JPA很难用,使用中发现Bug后不知道原因。本来用JPA是为了提升开发效率,不会使用反倒容易踩很多坑,所以我们需要系统地学习它。当你遇到复杂问题时,比如,平时你可能需要花几个小时想方法名、SQL逻辑,如果可以熟练地使用JPA,那么半小时甚至几分钟就可以写好查询方法了,再配合测试用例,你的开发质量也会明显提高。总之,系统地学习可以让你少走很多弯路。
第三,提高技术水平。Spring Data对数据操作进行了大统一,即统一了抽象关系型数据库和非关系型数据的接口、公共部分。当掌握了Spring Data JPA框架后,你几乎可以达到轻易实现Redis、MongoDB等NoSQL操作的水平,因为它们都有统一的Spring Data Commons。如下图所示,从中你可以看到Spring Data和JPA的全景位置关系,这样一来,就可以清楚地知道JPA的重要作用和脉络了。

第四,求职加分项。如果简历中突出Spring Data JPA框架的使用,会让面试官眼前一亮。因为掌握了JPA,就意味着掌握了很多原理,如Session原理、事务原理、PersistenceContext原理等,而掌握了底层原理对于技术人员来说可以在开发中解决很多问题。因此,公司可以由此更好地过滤和筛选人才,也能从侧面看出求职者是否对技术足够感兴趣。我认为未来3~5年,使用Spring Data JPA的人会越来越多,你可以在拉勾招聘网站上看到,很多招聘信息都会要求熟练掌握Spring Data JPA。
为什么要写这本书
因为我自己经历了上述曲折的实践,还因为看到不少朋友在学习Spring Data JPA的过程中存在不同的困惑和难点,所以我有了分享自身经验、给人帮助的想法。
当我们刚开始学习Spring Data JPA的时候,往往都会直接去看它的官方文档,但是很快就会发现其中的描述太过简单,经常会让人“知其然而不知其所以然”。有时候照着官方例子操作,发现有问题却又不知道错在哪里,这都是因为不了解其精髓和背后的原理,所以不容易上手。
而Spring Data JPA是对Hibernate的封装和增强,但由于之前国内用Hibernate的人不是很多,导致中文资料特别少,而且大部分资料都是直接翻译过来的,内容松散、不成体系,无法让人纵览全局,导致我们对原理的掌握不是特别深刻。
当我们遇到如Session、事务、LAZY异常等各种问题时,发现官网并没有详细的介绍,只能自己调试、硬啃源码才能解决问题。这时就需要花费大量的时间来研究源码,但又找不到可以参考的资料,而且不是每个公司都有“大神”愿意教你,此时是多么希望有一本书可以作为参考呀!
于是本书“带”着多年的实战经验来了,在这里我想告诉你,其实Spring Data JPA不难,只要你静下心来花时间研究,跟着本书的节奏,按顺序学完,就会觉得这门技术原来如此简单,在解决实际问题的时候也会游刃有余,你还会觉得JPA真的是被行业低估了!
如何阅读本书
本书是我多年来的实践经验总结,以“语法+源码+原理+实战经验”的形式全面地介绍了Spring Data JPA,可以帮助你节省至少3年自己研究的时间,让你真正掌握和发掘Spring Data JPA的实践价值。
本书主要分为四个部分,共33章。
第一部分:基础知识。从基本语法的视角,详细介绍Spring Data JPA的语法糖有哪些,包括相关的源码剖析、实际工作中的经验分享等。涵盖你在工作中会用到的Repository、Defining Query Methods(定义查询方法)、@Query的语法,以及实体(Entity)的注解等内容,帮助你全面掌握JPA的基本用法。
第二部分:高阶用法与实例。从实际工作中的复杂应用场景开始,为你讲解Repository自定义场景、MVC参数的扩展,以及数据源、事务、连接之间的关系等,帮助你解决实践中可能遇到的问题。
第三部分:原理在实战中的应用。掌握了基础知识和复杂应用场景后,再来了解其背后的原理,如Entity如何判断Dirty、Entity在什么时机提交到数据库、LAZY异常发生的原因、“N+1”SQL如何优化等。针对实际工作中踩过的坑,为你讲解解决思路和方法。
第四部分:思路扩展。本书最后从Spring Data Rest、测试用例、Spring Data ES、分库分表的角度带领大家扩展思路,了解发展方向,因为这些内容深挖了生态关系,可以为你打开思路,更好地帮助你掌握前面所学,做到举一反三,同时也会大大提高你的开发效率,使你开发出的代码质量更有保障。当你真正掌握了之后,就不会天天忙着“救火”,而是想着如何排除失火的隐患了。
作者寄语
希望你能认真阅读本书,因为本书不仅可以告诉你这是什么、怎么用,还能教会你学习步骤、学习方法,希望你能成长为技术极客。
相信把本书认认真真看完,你的技术和思考方式一定会得到质的飞越。也欢迎你给作者反馈学习感悟以及遇到的困难和挑战,我们一起讨论学习、共同进步。
最后希望你在学习本书的时候,保持空杯心态(不仅指这本书,在看其他技术书籍、博客、文章时也一样),因为只有保持空杯心态,我们才能装下更多的东西。接下来,让我们开启读书“旅程”吧!

上架指导

计算机\程序设计

封底文字

JPA规范是领域驱动设计在数据访问层落地的有力工具,它使程序员能够真正关注模型而不是底层的数据库映射来开发程序。而Spring Data JPA作为当今工业界使用最广泛的JPA实现,随着DDD与Spring框架的发展,正在变得越来越主流。通过本书,不仅可以学习到Spring Data JPA的使用方法,还能了解到它背后的设计思想,知其然亦知其所以然。
——周志明 《深入理解Java虚拟机》《凤凰架构》作者、阿里云MVP、腾讯云TVP、华为云MVP
随着微服务的发展,项目的构建速度越来越快,而Spring Data JPA大大提高了我们开发微服务的效率,降低了开发微服务的成本。相信本书能够帮助读者全面、深入地了解Spring Data JPA技术栈,让大家系统化掌握该框架。
——方腾飞  蚂蚁集团高级技术专家、并发编程网创始人
数据是系统之本,如何安全便捷地访问和管理数据,对任何应用来说都是需要重点关注的事情。如果你功力高深,走第一性原理用SQL当然没问题,但在软件早已是工业化属性的今天,如何安全、高效与便捷地交付才是关键,所以,Spring Data JPA也就顺其自然地通过Java生态里的强类型、动态代理等特性为广大Java开发者带来了安全、高效与便捷,这是一个自然演化的结果。如果说Spring是Java开发最佳实践经验的沉淀,那么Spring Data JPA是否也可以认为是数据访问层面最佳实践经验的优秀成果呢?
如果你还在手捧SQL或MyBatis而举足不前,那么,不妨尝试跟着本书作者的思路和步伐,一起来了解和领略Spring Data JPA的魅力吧,“柳暗花明又一村”的惊喜就在前面等着你!
——王福强 《Spring揭秘》《SpringBoot揭秘》作者
当下,关系型数据库仍然是各种业务系统的基石。而针对关系型数据访问,Spring家族专门提供了Spring Data JPA框架,该框架因其简洁性和高效性得到了广泛应用。本书从Spring Data JPA的核心概念出发,既提供了基础用法,又涵盖了高阶主题,并对延迟加载、N+1问题等常见应用场景进行了原理分析,可以说是广度和深度并行、理论与实践并重的一本优秀参考书。同时,本书还为广大开发人员深度剖析了与数据访问相关的架构设计思想,让你在学会框架应用的同时还能掌握对框架进行有效扩展的系统方法。
——郑天民  资深IT图书作译者
Spring Frameworks可以说是企业软件开发的事实标准,其中Spring Data JPA的精良设计与实现经过了行业广泛场景打磨,深入学习Spring Data JPA能够有效提升读者的架构、设计能力,进而提升职场竞争力。本书是作者在携程等互联网公司的系统架构、运维服务和核心框架的设计落地经验,理论结合深度生产实践,非常适合希望提升架构、设计能力的初中级Java后台开发工程师。
——杨晓峰 专家工程师、Tencent JDK负责人

图书目录

前 言
第一部分 基础知识
第1章 初识Spring Data JPA 2
1.1 Spring Boot和JPA演示 2
1.2 JPA如何整合MySQL数据库 8
1.2.1 切换MySQL数据源 8
1.2.2 Spring Data JPA测试用例的写法 10
1.3 整体认识JPA 11
1.3.1 市场上ORM框架的对比 11
1.3.2 JPA简介和开源实现 12
1.4 认识Spring Data 13
1.4.1 Spring Data简介 13
1.4.2 Spring Data的子项目 14
1.5 本章小结 15
第2章 全面掌握Spring Data Commons之Repository 16
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的实现类SimpleJpaRepository 26
2.7 Repository接口的启发 27
2.8 本章小结 28
第3章 定义查询方法的命名语法与参数 29
3.1 定义查询方法的配置和使用方法 29
3.1.1 直接通过方法名实现CRUD步骤 30
3.1.2 选择性暴露CRUD方法 30
3.2 方法的查询策略设置 31
3.3 定义查询方法的语法 32
3.3.1 语法剖析 32
3.3.2 关键源码 34
3.4 特定类型的参数:Sort和Pageable 36
3.5 限制查询结果:First和Top 38
3.6 @NonNull、@NonNullApi和@Nullable关键字 38
3.7 给我们的一些思考 39
3.8 本章小结 43
第4章 利用Repository中的方法返回值来解决实际问题 44
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章 @Query语法详解及其应用 63
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动态查询解决方法 74
5.6 本章小结 77
第6章 @Entity的常用注解及Java多态场景应用 78
6.1 JPA协议中关于实体的相关规定 78
6.2 实体里面常见的注解 79
6.3 生成注解的小技巧 85
6.4 联合主键 86
6.4.1 如何通过@IdClass实现联合主键 86
6.4.2 @Embeddable与@EmbeddedId注解的使用 88
6.5 如何实现实体之间的继承关系 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 关于继承关系的经验之谈 94
6.6 本章小结 95
第7章 实体之间关联关系注解的正确使用 96
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表达多对多的关联关系 112
7.4.2 @ManyToMany的最佳实践 114
7.5 本章小结 114
第8章 Jackson在实体里面的注解详解 115
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 如何解决死循环问题 127
8.4.2 JPA实体JSON序列化的常见报错及解决方法 128
8.4.3 推荐的配置项 129
8.4.4 JSON序列化和Java序列化 131
8.5 本章小结 131
第二部分 高阶用法与实例
第9章 QueryByExampleExecutor的用法和原理分析 135
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的实现原理 146
9.3.1 QueryByExampleExecutor的源码分析 146
9.3.2 JpaSpecificationExecutor的接口结构 148
9.3.3 通过QBE反向思考JpaSpecificationExecutor 149
9.4 本章小结 149
第10章 JpaSpecificationExecutor的实现原理 150
10.1 JpaSpecificationExecutor的使用案例 150
10.2 JpaSpecificationExecutor的语法详解 154
 10.2.1 Root root 156
 10.2.2 CriteriaQuery query 156
 10.2.3 CriteriaBuilder 157
10.3 JpaSpecificationExecutor的原理分析 158
10.4 JpaSpecificationExecutor实战 160
 10.4.1 自定义MySpecification 161
 10.4.2 利用Specification创建以search为查询条件的RESTful API 163
10.5 本章小结 165
第11章 Querydsl在JPA中的应用 166
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章 如何自定义Repository 180
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的实现类的方法 186
 12.3.1 第一种方法:定义独立的Repository的Impl实现类 186
 12.3.2 第一种方法的原理分析 187
 12.3.3 第二种方法:通过@EnableJpaRepositories定义默认的实现类 190
 12.3.4 第二种方法的原理分析 192
12.4 实际应用场景 193
12.5 本章小结 193
第13章 JPA的Auditing功能 194
13.1 Auditing是什么 194
13.2 如何实现Auditing 195
 13.2.1 第一种方式:直接在实例里面添加上述四个注解 195
 13.2.2 第二种方式:在实体里面实现Auditable接口 198
 13.2.3 第三种方式:利用@MappedSuperclass注解 200
13.3 JPA的Auditing功能解决了哪些问题 201
13.4 Auditing的实现原理 202
 13.4.1 Auditing的源码分析 202
 13.4.2 结论 204
13.5 本章小结 205
第14章 @Entity回调方法的正确使用 206
14.1 Java Persistence API规定的回调方法 206
 14.1.1 Entity的回调事件注解 206
 14.1.2 语法注意事项 207
14.2 JPA回调注解的使用方法 207
 14.2.1 第一种用法:在实体和super-class中使用 207
 14.2.2 第二种用法:自定义EntityListener 212
 14.2.3 关于@EntityListeners加载顺序的说明 214
14.3 JPA回调注解的最佳实践 214
14.4 JPA回调注解的实现原理和事件机制 216
14.5 本章小结 217
第15章 乐观锁机制和重试机制在实战中的应用 218
15.1 什么是乐观锁 218
15.2 乐观锁的实现方法 218
 15.2.1 @Version的用法 219
 15.2.2 @Version对Save方法的影响 222
15.3 isNew判断的逻辑 222
15.4 乐观锁机制和重试机制的实战 224
 15.4.1 重试机制详解 224
 15.4.2 @Retryable的详细用法 225
 15.4.3 乐观锁+重试机制的最佳实践 227
15.5 悲观锁的实现 227
15.6 本章小结 228
第16章 JPA对Web MVC开发的支持 229
16.1 DomainClassConverter组件 230
 16.1.1 一个实例 230
 16.1.2 源码分析 231
16.2 Page和Sort的参数支持 233
 16.2.1 一个实例 233
 16.2.2 原理分析 235
16.3 Web MVC的参数绑定 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对系统监控的支持 248
16.7 本章小结 249
第17章 自定义HandlerMethod-ArgumentResolver 250
17.1 Page和Sort参数 250
17.2 HandlerMethodArgumentResolver的用法 252
 17.2.1 HandlerMethodArgument-Resolver详解 252
 17.2.2 与HttpMessageConverter的关系 254
 17.2.3 HttpMessageConverter的执行顺序 254
17.3 HandlerMethodArgumentResolver实战 255
 17.3.1 自定义HandlerMethod-ArgumentResolver 256
 17.3.2 实际工作中的四种常见场景 259
17.4 思路拓展 261
 17.4.1 WebMvcConfigurer介绍 261
 17.4.2 对JSON的返回结果进行统一封装 262
17.5 本章小结 264
第18章 DataSource详解及其加载过程 265
18.1 数据源是什么 265
 18.1.1 DataSource源码分析 266
 18.1.2 数据源、驱动、连接和连接池的关系 268
18.2 数据源的加载原理和过程 269
 18.2.1 DataSourceAutoConfiguration数据源的加载过程分析 269
 18.2.2 Hikari数据源下的MySQL配置最佳实践 274
 18.2.3 Hikari数据通过Prometheus的监控指标应用 276
18.3 AliDruidDataSource的配置与介绍 278
18.4 命名策略详解及其实践 279
 18.4.1 Hibernate 5的命名策略 279
 18.4.2 加载原理与自定义方法 282
 18.4.3 实际应用场景 283
18.5 数据库的时区问题 283
 18.5.1 MySQL时间类型字段和时区的关系 283
 18.5.2 MySQL驱动处理时区的原理 285
18.6 本章小结 286
第19章 生产环境多数据源的处理方法 287
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 微服务下多数据源的思考 299
 19.2.3 微服务下的实战建议 300
19.3 本章小结 300
第20章 事务、连接池之间的关系与配置 301
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事务的实现原理 313
 20.3.1 Spring事务源码分析 313
 20.3.2 事务和连接池在JPA中的注意事项 318
20.4 本章小结 318
第三部分 原理在实战中的应用
第21章 JPA中的Hibernate加载过程与配置项 320
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 在调试时需要的日志配置 331
21.5 本章小结 333
第22章 理解Persistence Context的核心概念 334
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状态 337
 22.2.2 第二种:Detached状态 338
 22.2.3 第三种:Managed状态 339
 22.2.4 第四种:Removed状态 339
22.3 解密EntityManager的f lush()方法 340
 22.3.1 Flush的作用 340
 22.3.2 Flush机制 341
 22.3.3 Flush会改变SQL的执行顺序 342
 22.3.4 Flush与事务提交的关系 343
 22.3.5 Flush与乐观锁的关系 344
 22.3.6 saveAndFlush和save的区别 345
22.4 Dirty判断逻辑及其作用 346
 22.4.1 Dirty效果的例子 346
 22.4.2 Entity判断Dirty的过程 346
22.5 本章小结 347
第23章 Session的open-in-view对事务的影响 348
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创建和释放的日志 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章 如何在CompletableFuture异步线程中正确使用JPA 363
24.1 CompletableFuture的实际使用案例 363
 24.1.1 CompletableFuture的常见写法 363
 24.1.2 案例中表现出来的问题现状 364
24.2 异步方法步骤拆解 365
 24.2.1 CompletableFuture最佳实践 365
 24.2.2 通过日志查看事务的执行过程 367
 24.2.3 异步事务的正确使用方法 369
 24.2.4 Session机制与Repository.save(entity)的关系 372
24.3 异步场景下的思考 374
24.4 本章小结 375
第25章 为什么总会遇到LAZY异常 376
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章 如何正确解决经典的“N+1”SQL问题 388
26.1 什么是“N+1”SQL问题 388
26.2 减少N对应的SQL语句的条数 393
 26.2.1 hibernate.default_batch_fetch_size配置 393
 26.2.2 @BatchSize注解 395
26.3 Hibernate中获取数据的策略 399
 26.3.1 FetchMode.SELECT 399
 26.3.2 FetchMode.JOIN 401
 26.3.3 FetchMode.SUBSELECT 403
26.4 转变解决问题的思路 405
26.5 @NamedEntityGraph和@EntityGraph使用详解 406
 26.5.1 @NamedEntityGraph和@EntityGraph的用法 407
 26.5.2 @NamedEntityGraph和@EntityGraph使用实例 409
26.6 本章小结 412
第27章 SpEL在Spring中的使用方法 413
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章 QueryPlanCache详解 428
28.1 一级缓存 428
 28.1.1 什么是一级缓存 428
 28.1.2 一级缓存的作用 429
28.2 QueryPlanCache 432
 28.2.1 QueryPlanCache是什么 432
 28.2.2 QueryPlanCache存储的内容 433
 28.2.3 QueryPlanCache和Session的关系 436
28.3 QueryPlanCache中In查询条件引发的内存泄漏问题 438
 28.3.1 In查询条件引发内存泄漏的原因 438
 28.3.2 解决In查询条件内存泄漏的方法 440
28.4 本章小结 441
第四部分 思路扩展
第29章 二级缓存的思考:Redis与JPA如何结合 444
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的拼接规则 453
 29.3.3 异常时不要阻碍主流程 454
 29.3.4 改变默认的Cache中Redis的value序列化方式 455
29.4 本章小结 457
第30章 Spring Data Rest与JPA 458
30.1 Spring Data Rest Demo 458
30.2 Spring Data Rest的基本用法 461
 30.2.1 语义化的方法 461
 30.2.2 默认的状态码支持 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章 如何利用单元测试和集成测试让开发效率翻倍 468
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中的区别 481
31.5 本章小结 482
第32章 Spring Data ElasticSearch的用法 483
32.1 Spring Data ElasticSearch入门案例 483
32.2 Spring Data ElasticSearch中的关键类 491
32.3 ESRepository和JPARepository同时存在 492
32.4 本章小结 495
第33章 Sharding-JDBC与JPA结合使用进行分表 496
33.1 Sharding-JDBC简介 496
33.2 在JPA中利用Sharding-JDBC拆表 497
 33.2.1 利用JPA拆分256个表的使用案例 497
 33.2.2 实际集成过程中可能产生的问题 503
 33.2.3 Sharding-JDBC简单原理分析 503
33.3 分库的思考 505
 33.3.1 垂直拆分还是水平拆分 505
 33.3.2 微服务还是多数据库 506
 33.3.3 读写分离还是多读多写 506
 33.3.4 分布式事务如何处理 506
33.4 本章小结 507
结束语 师傅领进门,修行靠个人 508

教学资源推荐
作者: 刘振安 刘燕君 孙忱
作者: 马玉春 著
作者: 余永红
参考读物推荐
作者: 水滴技术团队 著
作者: 工信部通信行业职业技能鉴定指导中心 中国移动互联网基地 编著