Spring Data JPA:入门、实战与进阶

Spring Data JPA:入门、实战与进阶
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者:
2021-11
版次: 1
ISBN: 9787111692201
定价: 129.00
装帧: 其他
开本: 16开
纸张: 胶版纸
  • 本书是作者多年来的经验总结,以“语法 源码 原理 实战经验”的形式全面介绍了 Spring Data JPA。当你深入研究和理解了Spring Data JPA之后,就会发现它真是个好东西,从而真正掌握和发掘 Spring Data JPA 的实践价值。
      【本书共 33章,主要分为四部分】
      ●第1部分:基础知识,从基本语法的视角详细介绍 Spring Data JPA 的语法糖有哪些,包括相关的源码剖析、实际工作中的经验分享等,让你全面掌握 JPA 的基本用法。
      ●第2部分:高阶用法与实例,从实际工作中的复杂应用场景开始,依次讲解 Repository 自定义场景、MVC 参数的扩展,以及数据源、事务、连接之间的关系等,帮助你解决实践中可能会遇到的问题。
      ●第3部分:原理在实战中的应用,掌握了基础知识和复杂使用场景后,本部分将帮助你了解背后的原理,如 Entity 如何判断 Dirty、Entity 提交到数据库的时机、Lazy 异常发生的原因、“N 1 ”SQL 如何优化等,针对实际工作中踩过的坑,为你讲解解决思路和方法。
      ●第4部分:思路扩展,本书后从 Spring Data Rest、测试用例、Spring Data ES、分库分表等角度带你扩展思路。了解发展方向、深挖生态关系可以为你打开思路,更好地帮助你掌握前面所学,同时也会大大提高你的开发效率,使你的代码质量更有保障。 张振华

    资深Java研发工程师和架构师,在Java技术栈领域有丰富的实战经验,善于总结和分析问题,善于透过问题本质来解决实际工作中遇到的问题。

    曾就职于驴妈妈旅游网、上海携程旅行网、上海要买车网等互联网公司,有丰富的电商网站实战经验,就职期间担任过资深开发人员、架构师、技术专家等,对微服务体系有很深刻的认识。

    热衷于技术探索和研发,在GitChat、拉勾教育、CSDN上分享了大量关于Spring Data JPA、Java架构底层原理的文章,并获得一致好评。 【部分 基础知识】

    第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 
  • 内容简介:
    本书是作者多年来的经验总结,以“语法 源码 原理 实战经验”的形式全面介绍了 Spring Data JPA。当你深入研究和理解了Spring Data JPA之后,就会发现它真是个好东西,从而真正掌握和发掘 Spring Data JPA 的实践价值。
      【本书共 33章,主要分为四部分】
      ●第1部分:基础知识,从基本语法的视角详细介绍 Spring Data JPA 的语法糖有哪些,包括相关的源码剖析、实际工作中的经验分享等,让你全面掌握 JPA 的基本用法。
      ●第2部分:高阶用法与实例,从实际工作中的复杂应用场景开始,依次讲解 Repository 自定义场景、MVC 参数的扩展,以及数据源、事务、连接之间的关系等,帮助你解决实践中可能会遇到的问题。
      ●第3部分:原理在实战中的应用,掌握了基础知识和复杂使用场景后,本部分将帮助你了解背后的原理,如 Entity 如何判断 Dirty、Entity 提交到数据库的时机、Lazy 异常发生的原因、“N 1 ”SQL 如何优化等,针对实际工作中踩过的坑,为你讲解解决思路和方法。
      ●第4部分:思路扩展,本书后从 Spring Data Rest、测试用例、Spring Data ES、分库分表等角度带你扩展思路。了解发展方向、深挖生态关系可以为你打开思路,更好地帮助你掌握前面所学,同时也会大大提高你的开发效率,使你的代码质量更有保障。
  • 作者简介:
    张振华

    资深Java研发工程师和架构师,在Java技术栈领域有丰富的实战经验,善于总结和分析问题,善于透过问题本质来解决实际工作中遇到的问题。

    曾就职于驴妈妈旅游网、上海携程旅行网、上海要买车网等互联网公司,有丰富的电商网站实战经验,就职期间担任过资深开发人员、架构师、技术专家等,对微服务体系有很深刻的认识。

    热衷于技术探索和研发,在GitChat、拉勾教育、CSDN上分享了大量关于Spring Data JPA、Java架构底层原理的文章,并获得一致好评。
  • 目录:
    【部分 基础知识】

    第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 
查看详情
相关图书 / 更多
Spring Data JPA:入门、实战与进阶
Spark快速大数据分析 第2版
[美]朱尔斯·S. 达米吉 (美) 布鲁克·韦尼希 (印) 泰瑟加塔·达斯
Spring Data JPA:入门、实战与进阶
SparkSQL入门与数据分析实践
杨虹、谢显中、周前能、张安文 著
Spring Data JPA:入门、实战与进阶
Spring Boot+Vue.js+分布式组件全栈开发训练营(视频教学版)
曹宇;胡书敏
Spring Data JPA:入门、实战与进阶
SpringBoot从入门到实战
章为忠 著
Spring Data JPA:入门、实战与进阶
Spring Boot学习指南:构建云原生Java和Kotlin应用程序
[美]马克·赫克勒(Mark Heckler)
Spring Data JPA:入门、实战与进阶
Spring Cloud Alibaba 微服务架构实战派(上下册)
胡弦
Spring Data JPA:入门、实战与进阶
Spring Cloud Alibaba微服务开发从入门到实战
李伟杰 刘雪松 刘自强 王超 编著;开课吧 组编
Spring Data JPA:入门、实战与进阶
SpringBoot企业级开发实战(视频教学版)
迟殿委、赵媛媛、郭德先、侯传杰 著
Spring Data JPA:入门、实战与进阶
Spring Boot+Spring Cloud+Docker微服务架构开发实战
李晓黎
Spring Data JPA:入门、实战与进阶
SpringBoot整合开发实战
莫海 著
Spring Data JPA:入门、实战与进阶
Spring Security实战
[罗马尼亚]劳伦斯·斯皮尔卡(Lauren.iu Spilc.)著 蒲成 译
Spring Data JPA:入门、实战与进阶
Spinnaker实战:云原生多云环境的持续部署方案
王炜
您可能感兴趣 / 更多
Spring Data JPA:入门、实战与进阶
模拟电子技术与仿真
张振华;李洪芹
Spring Data JPA:入门、实战与进阶
舰艇振动学
张振华;陈志坚
Spring Data JPA:入门、实战与进阶
体育课程学
张振华 著
Spring Data JPA:入门、实战与进阶
现代物流装备
张振华 主编;贾淑娟 顾九春
Spring Data JPA:入门、实战与进阶
销讲成交策略
张振华 著
Spring Data JPA:入门、实战与进阶
马克思主义法治理论中国化70年
张振华 著;李其瑞、邱昭继、王金霞、王进、李步云、郭道晖 编
Spring Data JPA:入门、实战与进阶
中国汉字美学史6(现代卷)
张振华 著;李学勤、李明君 编
Spring Data JPA:入门、实战与进阶
学前儿童美术教育
张振华 著
Spring Data JPA:入门、实战与进阶
初级会计学
张振华、周洋 编
Spring Data JPA:入门、实战与进阶
白银案实录
张振华
Spring Data JPA:入门、实战与进阶
“手艺”课程探索:沛县封侯虎/江苏人民教育家培养工程丛书
张振华 著
Spring Data JPA:入门、实战与进阶
管理人员安全知识题解
张振华、沈浩 编写