5.2 使用 Spring Data JDBC 进行数据持久化

Spring 通过 Spring Data 项目支持多种数据持久化技术,该项目包含专门用于关系型数据库(JDBC、JPA、R2DBC)和非关系型数据库(Cassandra、Redis、Neo4J、MongoDB 等)的模块。Spring Data 提供通用的抽象和模式,使不同模块之间的导航变得简单直观。本节重点介绍关系型数据库,但应用程序与数据库交互的关键点(如图 5.3 所示)适用于所有模块。

图 5.3 驱动程序配置应用程序与数据库之间的连接。实体表示领域对象,可以通过仓库进行存储和检索。

图 5.3 中交互的主要元素是数据库驱动程序、实体和仓库:

  • 数据库驱动程序 — 提供与特定数据库集成的组件。对于关系型数据库,可以在命令式/阻塞应用程序中使用 JDBC 驱动程序(Java 数据库连接 API),或在响应式/非阻塞应用程序中使用 R2DBC 驱动程序。对于非关系型数据库,每个供应商都有自己的专用解决方案。

  • 实体 — 持久化到数据库中的领域对象。它们必须包含一个唯一标识每个实例的字段(主键),并可以使用专用注解配置 Java 对象和数据库条目之间的映射。

  • 仓库 — 用于数据存储和检索的抽象。Spring Data 提供基本实现,每个模块进一步扩展这些实现以提供特定数据库的功能。

本节将展示如何使用 Spring Data JDBC 为 Catalog Service 等 Spring Boot 应用程序添加数据持久化功能。您将配置连接池以通过 JDBC 驱动程序与 PostgreSQL 数据库交互,定义要持久化的实体,使用仓库访问数据,并使用事务。图 5.4 展示了本章结束时 Polar Bookshop 架构的样子。

图 5.4 Catalog Service 应用程序使用 PostgreSQL 数据库持久化图书数据。

Spring Data JDBC 还是 Spring Data JPA?

Spring Data 提供了两个主要选项来通过 JDBC 驱动程序将应用程序与关系型数据库集成:Spring Data JDBC 和 Spring Data JPA。如何选择?答案取决于您的需求和具体场景。

Spring Data JPA(https://spring.io/projects/spring-data-jpa)是 Spring Data 项目中使用最广泛的模块。它基于 Java 持久化 API(JPA),这是 Jakarta EE(以前称为 Java EE)中包含的标准规范。Hibernate 是最流行的实现,它是一个强大且经过实战检验的对象关系映射(ORM)框架,用于管理 Java 应用程序中的数据持久化。Hibernate 提供了许多有用的功能,但它也是一个复杂的框架。如果您不了解持久化上下文、延迟加载、脏检查或会话等方面,可能会遇到难以调试的问题。一旦您更了解这个框架,就会欣赏 Spring Data JPA 如何简化操作并提高生产力。

Spring Data JDBC(https://spring.io/projects/spring-data-jdbc)是 Spring Data 家族中较新的成员。它按照领域驱动设计(DDD)概念(如聚合、聚合根和仓库)与关系型数据库集成。它轻量级、简单,是微服务的绝佳选择,因为微服务中的领域通常被定义为限界上下文(另一个 DDD 概念)。它给开发人员更多控制 SQL 查询的权力,并允许使用不可变实体。作为 Spring Data JPA 的更简单替代方案,它不能在所有场景中替代 JPA,因为它不提供 JPA 的所有功能。

我选择在这里介绍 Spring Data JDBC,是因为它与云原生应用程序的良好契合和简单性。得益于 Spring Data 的通用抽象和模式,您可以轻松地将项目从 Spring Data JDBC 转换为 Spring Data JPA。在接下来的章节中,我将指出两者之间的主要差异,以便您有足够的信息尝试使用 Spring Data JPA 实现相同的需求。

results matching ""

    No results matching ""