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> {
}
保存聚合根实体:
可以使用该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。它可用于潜在地清除要发布的事件列表(以及其他用途)。
DDD+SpringBoot/SpringCloud微服务视频教程免费下载
更多专题
多年的教训:根据DDD设计原则改变JPA/Hibernate的使用方式 - lorenzo
Spring Data JDBC介绍
使用Spring Data JDBC实现DDD聚合
Spring Data JDBC一对一和一对多关系实现
Spring Data JDBC的宠物店源码
Spring Data JDBC实现订单聚合示例
Spring Boot实现DDD的货运Cargo微服务案例源码
使用Java实现DDD持久性构建机制,避免JPA等基础设施污染领域模型
相关话题
#DDD实体模型 #SpringData #DDD聚合 SpringBoot