Spring Data JDBC教程

  Spring Data JDBC是Spring Data系列的一部分,可以轻松实现基于JDBC的存储库。该模块处理对基于JDBC的数据访问层的增强支持。它使构建使用数据访问技术的Spring驱动程序更容易。

  Spring Data JDBC背后的想法是提供对关系数据库的访问,而无需处理JPA的复杂性。JPA提供延迟加载,缓存和脏跟踪等功能。果你需要这些功能会很很棒,但会让猜测JPA的行为比非JPA更难。

不是ORM

  Spring Data JDBC不会尝试成为ORM。它不是JPA的竞争对手。相反,它更像是个人ORM的构建工具包,您可以定义自己喜欢或需要的方式。

聚合根

  Spring Data存储库的灵感来自于Eric Evans的Domain Driven Design领域驱动设计一书中描述的存储库Repository。这样做的一个结果是每个聚合根应该有一个存储库。Aggregate Root聚合根是同一本书中的另一个概念,描述了一个实体,它控制其他实体的生命周期,这些实体一起是聚合。Aggregate是模型的一个子集,它在对Aggregate Root的方法调用之间保持一致。

  Spring Data JDBC尽力鼓励您根据这些想法对领域进行建模。

  聚合是一组实体,它们保证在原子更改之间保持一致。一个典型的例子是一个Order用OrderItems。在进行更改时Order,属性(例如,numberOfItems与实际数量OrderItems一致)保持一致。

  每个聚合只有一个聚合根,它是聚合的一个实体。聚合只能通过该聚合根上的方法进行操作。这些是前面提到的原子变化一致性。

  Spring Data JDBC假定只有聚合具有存储聚合的非根实体的表的外键,而没有其他实体指向非根实体。

特征

  • 具有可自定义的简单聚合的CRUD操作NamingStrategy。

  • 支持@Query注释。

  • 支持MyBatis查询。

  • 事件 审计

  • 基于JavaConfig的存储库配置介绍@EnableJdbcRepositories。

配置

  pom.xml导入spring-boot-starter-data-jdbc:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

数据库可以使用Hsqldb:

<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>

 

 

存储库

  Spring Data存储库抽象中的中央接口是Repository。它将领域类以及ID作为类型参数进行管理。此接口主要用作标记接口,用于捕获要使用的类型,并帮助发现扩展此接口的接口。


public interface ProductRepository extends Repository<Product, Integer> {

Product findById(Integer id);

void save(Product pet);
}

  

保存聚合根实体:

可以使用该ProductRepository.save(…)方法执行保存聚合。如果聚合是新的,则会导致聚合根的插入,然后是所有直接或间接引用的实体的插入语句。

如果聚合根不是新的,则删除所有引用的实体,更新聚合根,并再次插入所有引用的实体。请注意,实例是否为new是实例状态的一部分。

源码:Github

 

从聚合根发布事件

  由存储库管理的实体是聚合根。在领域驱动设计应用程序中,这些聚合根通常会发布领域事件。Spring Data提供了一个注释@DomainEvents,可以在聚合根的方法上使用,以使该发布尽可能简单,如以下示例所示:

class AnAggregateRoot {

@DomainEvents
Collection<Object> domainEvents() {
// … return events you want to get published here
}

@AfterDomainEventPublication
void callbackMethod() {
// … potentially clean up domain events list
}
}

使用的方法@DomainEvents可以返回单个事件实例或事件集合。
在所有事件发布后,我们有一个注释的方法@AfterDomainEventPublication。它可用于潜在地清除要发布的事件列表(以及其他用途)。

 

更多专题

Spring Data JDBC介绍

使用Spring Data JDBC实现DDD聚合

Spring Data JDBC的宠物店源码

相关话题

#DDD实体模型      #SpringData      #DDD聚合     SpringBoot