
Spring Data JPA原理与实战
文章平均质量分 94
Spring Data JPA 是 Spring Data 项目的一部分,它提供了一种简化的数据访问方式,用于与关系型数据库进行交互。它基于 Java Persistence API(JPA) 标准,并提供了一套简洁的 API 和注解,使开发人员能够通过简单的 Java 对象来表示数据库表,并通过自
知春秋
不忘初心,方得始终。初心易得,始终难守。
展开
-
19 | 如何搞清楚事务、连接池的关系?正确配置是怎样的
第一步:新建一个 TransactionHelper 类,进行事务管理,代码如下。复制代码/*** 利用spring进行管理*/@Component/*** 利用spring 的机制和jdk8的function机制实现事务*/@Transactional(rollbackFor = Exception.class) //可以根据实际业务情况,指定明确的回滚异常第二步:直接在 service 中就可以使用了,代码如下。复制代码@Autowired==/**原创 2023-10-15 20:40:27 · 1499 阅读 · 0 评论 -
18 | 生产环境多数据源的处理方法有哪些
我们都知道 DataSource 的本质是获得数据库连接,而 AbstractRoutingDataSource 帮我们实现了动态获得数据源的可能性。下面还是通过一个例子看一下它是怎么使用的。第一步:定一个数据源的枚举类,用来标示数据源有哪些。复制代码/*** 定义一个数据源的枚举类*/DB1, //实际工作中枚举的语义可以更加明确一点;DB2;return e;return db1;//没找到的情况下,默认返回数据源1。原创 2023-10-15 20:38:24 · 261 阅读 · 0 评论 -
17 | DataSource 为何物?加载过程是怎样的
在实际工作中,由于 HikariCP 和 Druid 各有千秋,国内的很多开发者都使用 AliDruid 作为数据源,我们看看都是怎么配置的,每一步都很简单。第一步:引入 Gradle 依赖。复制代码第二步:配置数据源。复制代码spring.datasource.druid.url= # 或spring.datasource.url=spring.datasource.druid.username= # 或spring.datasource.username=原创 2023-10-15 20:37:16 · 930 阅读 · 0 评论 -
16 | 如何自定义 HandlerMethodArgumentResolvers
在实际的工作中,你可能会遇到对老项目进行改版的工作,如果要我们把旧的 API 接口改造成 JPA 的技术实现,那么可能会出现需要新、老参数的问题。假设在实际场景中,我们 Page 的参数是 page[number],而 page size 的参数是 page[size],看看应该怎么做。第一步:新建 MyPageableHandlerMethodArgumentResolver。用来兼容?page[size]=2&page[number]=0 的参数情况;支持 JPA 新的参数形式?原创 2023-10-15 20:35:58 · 364 阅读 · 0 评论 -
15 | JPA 对 Web MVC 开发者做了哪些支持
正常情况下,我们开启 Spring Data 对 Spring Web MVC 支持的时候需要在 @Configuration 的配置文件里面添加 @EnableSpringDataWebSupport 这一注解,如下面这种形式:复制代码由于我们用了 Spring Boot,其有自动加载机制,会自动加载 SpringDataWebAutoConfiguration 类,发生如下变化:复制代码。原创 2023-10-15 20:34:20 · 522 阅读 · 0 评论 -
14 | 乐观锁机制和重试机制在实战中应该怎么用
乐观锁在实际开发过程中很常用,它没有加锁、没有阻塞,在多线程环境以及高并发的情况下 CPU 的利用率是最高的,吞吐量也是最大的。而 Java Persistence API 协议也对乐观锁的操作做了规定:通过指定 @Version 字段对数据增加版本号控制,进而在更新的时候判断版本号是否有变化。如果没有变化就直接更新;如果有变化,就会更新失败并抛出“OptimisticLockException”异常。我们用 SQL 表示一下乐观锁的做法,代码如下:复制代码。原创 2023-10-15 20:32:50 · 1137 阅读 · 0 评论 -
13 | 如何正确使用 @Entity 里面的回调方法
复制代码@Log4j2如果注释了,测试用例这个地方的验证也需要去掉@PreUpdate如果注释了,测试用例这个地方的验证也需要去掉@PreRemove@PostLoad//查询方法里面可以对一些敏感信息做一些日志我们上面注释的代码,也可以改变 entity 里面的值,但是在这个 Listener 的里面我们不做修改,所以把 setVersion 和 setCreateUserId 注释掉了,要注意测试用例里面这两处也需要修改。原创 2023-10-15 20:31:41 · 555 阅读 · 0 评论 -
12 | JPA 的审计功能解决了哪些问题
Auditing 是帮我们做审计用的,当我们操作一条记录的时候,需要知道这是谁创建的、什么时间创建的、最后修改人是谁、最后修改时间是什么时候,甚至需要修改记录……1.可以很容易地让我们写自己的 BaseEntity,把一些公共的字段放在里面,不需要我们关心太多和业务无关的字段,更容易让我们公司的表更加统一和规范,就是统一加上 @CreatedBy、@CreatedDate、@LastModifiedBy、@LastModifiedDate 等。而其他都不变,我们再跑一次刚才的测试用例,发现效果是一样的。原创 2023-10-15 20:30:19 · 587 阅读 · 0 评论 -
11 | JpaRepository 如何自定义
Java Persistence API 规定,操作数据库实体必须要通过 EntityManager 进行,而我们前面看到了所有的 Repository 在 JPA 里面的实现类是 SimpleJpaRepository,它在真正操作实体的时候都是调用 EntityManager 里面的方法。原创 2023-10-15 20:28:48 · 1090 阅读 · 0 评论 -
10 | JpaSpecificationExecutor 实现的原理是什么
我们可以自定义一个Specification 的实现类,它可以实现任何实体的动态查询和各种条件的组合。复制代码/*** 实现实体根据不同的字段、不同的Operator组合成不同的Predicate条件*/@Override} else {我们通过 `` 泛型,解决不同实体的动态查询(当然了,我只是举个例子,这个方法可以进行无限扩展)。我们通过 SearchCriteria 可以知道不同的字段是什么、值是什么、如何操作的,看一下代码:复制代码/**原创 2023-10-15 20:27:09 · 222 阅读 · 0 评论 -
09 | JpaSpecificationExecutor 解决了哪些问题
那么我们再看一下参数 ExampleSpecification 的源码,发现它是接口 Specification 的实现类,并且是非公开的实现类,可以通过接口对外暴露 and、or、not、where 等组合条件的查询条件。我们通过查看 JpaSpecificationExecutor 的 Structure 图会发现,方法就有这么几个,细心的同学这个时候会发现它的参数 Specification,正是我们分析 QueryByExampleExecutor 的原理时候使用的 Specification。原创 2023-10-15 20:25:27 · 365 阅读 · 0 评论 -
08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?
我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明,这看似和 JPA 没什么关系,但是一旦我们和 @Entity 一起使用的时候,就会遇到一些问题,特别是新手同学,我们这一课时详细介绍一下用法。先来跟着我了解一下 Jackson 的基本语法。原创 2023-10-13 18:51:01 · 757 阅读 · 0 评论 -
07 | @Entity 之间的关联关系注解如何正确使用?
实体与实体之间的关联关系一共分为四种,分别为 OneToOne、OneToMany、ManyToOne 和 ManyToMany;而实体之间的关联关系又分为双向的和单向的。实体之间的关联关系是在 JPA 使用中最容易发生问题的地方,接下来我将一一揭晓并解释。我们先看一下 OneToOne,即一对一的关联关系。原创 2023-10-13 18:50:06 · 1255 阅读 · 0 评论 -
06 | @Entity 里面的 JPA 注解有哪些?在 Java 多态场景下如何使用?
前几课时我为你介绍了 Repository 的用法,其中我经常会提到“实体类”(即我们前面的 User 类),它是对我们数据库中表的 Metadata 映射,那么具体如何映射呢?这一课时我们来讲解。我们先看一下 Java Persistence API 里面都有哪些重要规定;再通过讲解基本注解,重点介绍一下联合主键和实体之间的继承关系,然后你就会知道 JPA 的实体里面常见的注解有哪些。话不多说,看一下 Entity 的相关规定。原创 2023-10-13 18:49:00 · 1901 阅读 · 0 评论 -
05 | @Query 解决了什么问题?什么时候应该选择它?
上面我介绍了 @Query 的基本用法,下面介绍一下 @Query 在我们的实际应用中最受欢迎的两处场景。原创 2023-10-13 18:47:42 · 1002 阅读 · 0 评论 -
04 | 如何利用 Repository 中的方法返回值解决实际问题?
官方给我们提供了自定义 Streamable 的方法,不过在实际工作中很少出现要自定义保证结果类的情况,在这里我简单介绍一下方法,看如下例子:复制代码(4)以上四个步骤介绍了自定义 Streamable 的方法,分别为:(1)Product 实体,公开 API 以访问产品价格。(2)Streamable`` 的包装类型可以通过 Products.of(…) 构造(通过 Lombok 注解创建的工厂方法)。(3)包装器类型在 Streamable`` 上公开了计算新值的其他 API。原创 2023-10-13 18:46:12 · 735 阅读 · 0 评论 -
03 | Defining Query Methods 的命名语法与参数
若想要实现 CRUD 的操作,常规做法是写一大堆 SQL 语句。但在 JPA 里面,只需要继承 Spring Data Common 里面的任意 Repository 接口或者子接口,然后直接通过方法名就可以实现,神不神奇?来看下面具体的使用步骤。第 1 步,User 实体的 UserRepository 继承 Spring Data Common 里面的 Repository 接口:复制代码第 2 步,对于 Service 层就可以直接使用 UserRepository 接口:复制代码。原创 2023-10-13 18:44:53 · 301 阅读 · 0 评论 -
02 | Spring Data Common 之 Repository 如何全面掌握?
本课时到这里就结束了,这一课时我讲解了 Repository 接口、CrudRepository 接口、PagingAndSortingRepository 接口、JpaRepository 接口的用法,通过源码我们知道了接口里面的方法有哪些、怎么实现的,也知道了 Spring 的动态代理机制是怎么运用到 UserRepository 接口的。原创 2023-10-13 18:43:33 · 412 阅读 · 0 评论 -
01 | Spring Data JPA 初识
JPA 是 JDK 5.0 新增的协议,通过相关持久层注解(@Entity 里面的各种注解)来描述对象和关系型数据里面的表映射关系,并将 Java 项目运行期的实体对象,通过一种Session持久化到数据库中。想象一下,一旦协议有了,大家都遵守了此种协议进行开发,那么周边开源产品就会大量出现,比如我们在后面要介绍的第 29 课时(Spring Data Rest 是什么?和 JPA 是什么关系?原创 2023-10-13 18:40:17 · 225 阅读 · 0 评论