乒乓球世界杯_世界杯结束时间 - 0123838.com
首页世界杯意大利正文

终于有人把Spring Data JPA 讲明白了!

2025-08-28 12:39:55

【第一部分 基础知识】

第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

豪华品质不加价 映众GTX660冰龙版评测 糖宝意思
相关内容