介绍
本章讲解 Spring Data 仓库的基础。在继续阅读 JDBC 或 R2DBC 的具体内容之前,请确保您对这里讲解的基本概念有扎实的理解。
Spring Data 仓库抽象的目标,是大幅减少为各种持久化存储实现数据访问层所需的样板代码量。
本节小结
📄️ 核心概念
Spring Data 仓库抽象中的核心接口是 Repository 。它以要管理的领域类以及该领域类的标识符类型作为类型参数。该接口主要用作标记接口,用于捕获要处理的类型,并帮助您发现扩展该接口的其他接口。
📄️ 定义仓库接口
要定义仓库接口,您首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 Repository ,并指定领域类和 ID 类型作为类型参数。如果您想为该领域类型暴露 CRUD 方法,可以扩展 CrudRepository 或其变体之一,而不是 Repository 。
📄️ 创建仓库实例
本节介绍如何为已定义的仓库接口创建实例和 bean 定义。
📄️ 定义查询方法
仓库代理有两种从方法名派生特定存储查询的方式:
📄️ 投影
Spring Data 查询方法通常返回仓库所管理的聚合根的一个或多个实例。但是,有时可能希望基于这些类型的某些属性创建投影。 Spring Data 允许建模专用的返回类型,以更有选择地检索所管理聚合的部分视图。
📄️ 对象映射基础
本节介绍 Spring Data 对象映射、对象创建、字段与属性访问、可变性与不可变性的基础知识。请注意,本节仅适用于不使用底层数据存储对象映射(如 JPA )的 Spring Data 模块。另请务必参阅特定存储部分,了解特定存储的对象映射,例如索引、自定义列名或字段名等。
📄️ 自定义转换
以下 Spring `Converter` 实现示例将 `String` 转换为自定义的 `Email` 值对象:
📄️ 自定义仓库实现
Spring Data 提供了多种选项,让您无需大量编码即可创建查询方法。但当这些选项不能满足您的需求时,您也可以为仓库方法提供自己的自定义实现。本节介绍如何做到这一点。
📄️ Spring Data 扩展
本节介绍一组 Spring Data 扩展,它们使 Spring Data 能够在各种上下文中使用。目前,大部分集成都面向 Spring MVC 。
📄️ 值表达式基础
值表达式( Value Expressions )是 Spring 表达式语言( SpEL )与属性占位符解析的结合。它将对编程式表达式的强大求值能力,与借助属性占位符解析从 Environment 获取配置属性等值的简便方式结合在一起。
📄️ 按示例查询
本章介绍按示例查询( Query by Example ),并说明如何使用它。
📄️ 从聚合根发布事件
由仓库管理的实体是聚合根。在领域驱动设计应用程序中,这些聚合根通常会发布领域事件。 Spring Data 提供了一个名为 @DomainEvents 的注解,您可以在聚合根的某个方法上使用它,以尽可能简便地完成发布,如下例所示:
📄️ 实体回调
Spring Data 基础设施在某些方法调用前后提供了用于修改实体的钩子。这些所谓的 EntityCallback 实例以回调式风格提供了一种便捷方式,用于检查实体并可能修改它。一个 EntityCallback 看起来非常像一个专用的 ApplicationListener 。一些 Spring Data 模块会发布特定存储的事件(例如 BeforeSaveEvent ),允许修改给定的实体。在某些情况下(例如处理不可变类型时),这些事件可能会带来麻烦。此外,事件发布依赖 ApplicationEventMulticaster 。如果为其配置了异步 TaskExecutor ,由于事件处理可能被派发到某个 Thread 上,结果将难以预测。
📄️ 仓库方法的空值处理
返回单个聚合实例的仓库 CRUD 方法可以使用 Optional 来指示值可能不存在。除此之外, Spring Data 还支持在查询方法上返回以下包装类型:
📄️ 仓库查询关键词
下表列出了 Spring Data 仓库查询派生机制普遍支持的、用于表达谓词的主题关键词。有关受支持关键词的确切列表,请查阅特定存储的文档,因为此处列出的某些关键词在特定存储中可能不受支持。
📄️ 仓库查询返回类型
下表列出了 Spring Data 仓库普遍支持的返回类型。但是,有关受支持返回类型的确切列表,请查阅特定存储的文档,因为此处列出的某些类型在特定存储中可能不受支持。