JDBC
Spring Data JDBC 模块将 Spring 核心概念应用于使用 JDBC 数据库驱动程序的解决方案开发中,这些方案遵循领域驱动设计原则。我们提供了一个“模板”作为存储和查询聚合的高级抽象。
本文档是 Spring Data JDBC 支持的参考指南。它解释了相关的概念、语义和语法。
本章指出了 JDBC 存储库支持的特殊性。这一内容建立在 Working with Spring Data Repositories 中解释的核心存储库支持之上。您应该对其中解释的基本概念有深入的理解。
章节摘要
📄️ 为什么要使用 Spring Data JDBC?
在 Java 世界中,关系型数据库的主要持久化 API 无疑是 JPA,它有自己的 Spring Data 模块。为什么还需要另一个呢?
📄️ 领域驱动设计与关系型数据库
所有 Spring Data 模块都受到了领域驱动设计(Domain Driven Design)中“仓库(repository)”、“聚合(aggregate)”以及“聚合根(aggregate root)”概念的启发。这些概念对于 Spring Data JDBC 来说可能更加重要,因为它们在某种程度上与使用关系型数据库时的常规做法有所不同。
📄️ 快速开始
一个简单的设置工作环境的方法是使用 Spring Tools 或通过 Spring Initializr 创建一个基于 Spring 的项目。
📄️ 持久化实体
保存聚合可以通过 CrudRepository.save(…) 方法执行。如果聚合是新的,这将导致对聚合根进行插入操作,随后对所有直接或间接引用的实体执行插入语句。
📄️ 映射
MappingJdbcConverter 提供了丰富的映射支持。MappingJdbcConverter 拥有一个丰富的元数据模型,允许将领域对象映射到数据行。该映射元数据模型通过在领域对象上使用注解来填充。然而,该基础设施并不仅限于使用注解作为元数据信息的唯一来源。MappingJdbcConverter 还允许你通过遵循一组约定,将对象映射到行,而无需提供任何额外的元数据。
📄️ 查询方法
本节提供了一些关于 Spring Data JDBC 实现和使用的具体信息。
📄️ MyBatis 集成
CRUD 操作和查询方法可以委托给 MyBatis。本节介绍如何配置 Spring Data JDBC 以与 MyBatis 集成,以及遵循哪些约定将查询的执行和映射交给该库。
📄️ 生命周期事件
Spring Data JDBC 向 ApplicationListener 对象发布生命周期事件,通常是应用上下文中的 bean。事件是关于某个生命周期阶段的通知。与实体回调不同,事件旨在用于通知。事务监听器将在事务完成时接收事件。事件和回调仅针对聚合根触发。如果你想处理非根实体,你需要通过包含聚合根的监听器来完成。
📄️ 审计
为了启用审计功能,请在你的配置中添加 @EnableJdbcAuditing,如下例所示:
📄️ 事务性
默认情况下,CrudRepository 实例的方法是事务性的。对于读取操作,事务配置的 readOnly 标志被设置为 true。所有其他操作都配置了普通的 @Transactional 注解,以便应用默认的事务配置。有关详细信息,请参阅 SimpleJdbcRepository 的 Javadoc。如果你需要调整在仓库中声明的某个方法的事务配置,可以在你的仓库接口中重新声明该方法,如下所示:
📄️ 模式创建
在使用 SQL 数据库时,模式(schema)是一个重要组成部分。Spring Data JDBC 支持多种模式选项,但在从领域模型开始时,构建初始领域模型可能具有挑战性。为了帮助您采用代码优先的方法,Spring Data JDBC 提供了与 Liquibase 的集成,用于创建数据库变更集。