你好,我是张振华,在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、分库分表的角度带领大家扩展思路,了解发展方向,因为这些内容深挖了生态关系,可以为你打开思路,更好地帮助你掌握前面所学,做到举一反三,同时也会大大提高你的开发效率,使你开发出的代码质量更有保障。当你真正掌握了之后,就不会天天忙着“救火”,而是想着如何排除失火的隐患了。