前言 勇敢地走出舒适区,突破自己的技术瓶颈 你好,我是张振华,在Java领域从业已有十几年,也算是一个“Java老兵”了,我曾先后在驴妈妈、携程等互联网公司担任Java架构师、开发主管等职务。在工作期间,我既负责过后端服务的平台架构,也实现过微服务的升级,同时还写过公司的很多核心框架,遇到过很多人都会遇到的常见问题,积累并总结了一些可以复用和迁移的宝贵经验。 我是如何学习Spring Data JPA的 大概四五年前,公司入职了一批架构师,他们引入了Spring Data JPA框架。起初接触这个框架时我的确很排斥,心想,这么复杂的框架真不如MyBatis简单—随便写个简单的SQL就好了,为什么要学 A呢?而且还要学习一大堆相关联的东西(比如要了解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框架的使用,会让
导语摘要 本书主要分为四个模块,共33章。 模块一主要从基本语法的视角,来详细介绍 Spring Data JPA 的语法糖有哪些,包括源码的剖析、实际工作中的经验分享,以及作者对此的思考、启发。模块二从实际工作中的复杂应用场景开始,依次讲解自定义场景,如何扩展 Spring 给我们提供的框架、数据源、连接、事务之间的关系,帮助读者解决实践中可能会遇到的问题,并学会独立思考、稳妥解决。模块三讲解了实际工作遇到的经典问题,如 N+1 sql、lazy、事务的问题,及作者对此的思考和解决思路。模块四从 Spring Data Rest、Spring Data ES、测试用例的角度,扩展思路,展望一下发展方向。
作者简介
张振华 Java研发工程师和架构师,在Java技术栈领域有丰富的实战经验,善于总结和分析问题,善于透过问题本质来解决实际工作中遇到的问题。 曾就职于驴妈妈旅游网、上海携程旅行网、上海要买车网等互联网公司,有丰富的电商网站实战经验,就职期间担任过开发人员、架构师、技术专家等,对微服务体系有很深刻的认识。 热衷于技术探索和研发,在GitChat、拉勾教育、CSDN上分享了大量关于Spring Data JPA、Java架构底层原理的文章,并获得一致好评。
内容摘要 本书主要分为四个模块,共33章。 模块一主要从基本语法的视角,来详细介绍 Spring Data JPA 的语法糖有哪些,包括源码的剖析、实际工作中的经验分享,以及作者对此的思考、启发。模块二从实际工作中的复杂应用场景开始,依次讲解自定义场景,如何扩展 Spring 给我们提供的框架、数据源、连接、事务之间的关系,帮助读者解决实践中可能会遇到的问题,并学会独立思考、稳妥解决。模块三讲解了实际工作遇到的经典问题,如 N+1 sql、lazy、事务的问题,及作者对此的思考和解决思路。模块四从 Spring Data Rest、Spring Data ES、测试用例的角度,扩展思路,展望一下发展方向。
主编推荐 (1)资深架构师多年一线JPA开发实战经验总结,资深专家多年经验总结,从入门到精通,从原理到实战,深入浅出地完整掌握Spring Data JPA,从而提升开发效率。 (2)从基
以下为对购买帮助不大的评价