JDBC
Spring Data JDBC 模块将 Spring 的核心概念应用于使用 JDBC 数据库驱动程序的解决方案开发,并使其与领域驱动设计原则保持一致。我们提供一个「模板」作为存储和查询聚合的高层抽象。
本文档是 Spring Data JDBC 支持的参考指南。它解释了相关概念、语义和语法。
本章指出 JDBC 在仓库支持方面的特点。它建立在使用 Spring Data 仓库中讲解的核心仓库支持之上。您应充分理解其中讲解的基本概念。
本节小结
📄️ 为什么选择 Spring Data JDBC?
Java 世界中用于关系数据库的主要持久化 API 当然是 JPA ,它有自己的 Spring Data 模块。为什么还要有另一个?
📄️ 领域驱动设计与关系型数据库
所有 Spring Data 模块都受到领域驱动设计中「仓库」「聚合」和「聚合根」概念的启发。这些概念对于 Spring Data JDBC 可能甚至更为重要,因为它们在某种程度上与使用关系型数据库时的常规做法相抵触。
📄️ 入门
初始化工作环境的一个简单方式是在 Spring Tools 中或通过 Spring Initializr 创建一个基于 Spring 的项目。
📄️ 持久化实体
保存聚合可使用 CrudRepository.save(…) 方法完成。如果聚合是新的,这将对聚合根执行一次插入,并随后对所有直接或间接引用的实体执行插入语句。
📄️ 序列支持
主键属性(用 @Id 注解)也可以用 @Sequence 注解。 @Sequence 注解的存在表示该属性的初始值应在对象保存时从数据库序列获取。数据库生成序列的能力由所使用的数据库方言决定。在没有 @Sequence 注解时,假定对应列的值由数据库在插入行时自动生成。
📄️ 映射
`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 数据库时,模式是重要的组成部分。 Spring Data JDBC 支持广泛的模式选项,但在从领域模型起步时,设计出初始领域模型可能颇具挑战。为协助您采用代码优先的方式, Spring Data JDBC 内置了使用 Liquibase 创建数据库变更集的集成。
📄️ AOT(提前编译)优化
本章介绍 Spring Data 的 AOT (提前编译)优化,这些优化构建在 Spring 的 AOT (提前编译)优化之上。