原标题:Spring认证|Spring Data JDBC参考文档(内容来源:Spring中国教育管理中心)
9. JDBC 存储库
本章指出了 JDBC 存储库支持的特殊性。这建立在使用 Spring Data Repositories 中解释的核心存储库支持之上。您应该对那里解释的基本概念有充分的了解。
9.1. 为什么选择 Spring Data JDBC?
Java 世界中关系数据库的主要持久化 API 肯定是 JPA,它有自己的 Spring Data 模块。为什么还有一个?
JPA 做了很多事情来帮助开发人员。除其他外,它跟踪对实体的更改。它为你做延迟加载。它使您可以将广泛的对象构造映射到同样广泛的数据库设计。
这很棒,让很多事情变得非常简单。只需看一下基本的 JPA 教程。但是,对于 JPA 为什么要做某件事,这常常让人感到困惑。此外,概念上非常简单的事情在 JPA 中变得相当困难。
Spring Data JDBC 旨在通过采用以下设计决策在概念上更简单:
如果您加载一个实体,SQL 语句就会运行。完成此操作后,您将拥有一个完全加载的实体。没有进行延迟加载或缓存。
如果您保存一个实体,它将被保存。如果您不这样做,则不会。没有脏跟踪,也没有会话。
有一个关于如何将实体映射到表的简单模型。它可能只适用于相当简单的情况。如果您不喜欢那样,您应该编写自己的策略。Spring Data JDBC 仅对使用注释自定义策略提供非常有限的支持。
9.2. 领域驱动设计和关系数据库。
所有 Spring Data 模块都受到领域驱动设计中“存储库”、“聚合”和“聚合根”概念的启发。这些对于 Spring Data JDBC 来说可能更为重要,因为在某种程度上,它们与使用关系数据库时的常规做法背道而驰。
聚合是一组实体,可以保证在对其进行原子更改之间保持一致。一个经典的例子是Orderwith OrderItems。上的属性Order(例如,numberOfItems与 的实际数量OrderItems一致)在进行更改时保持一致。
跨聚合的引用不能保证在任何时候都是一致的。他们保证最终会变得一致。
每个聚合都有一个聚合根,它是聚合的实体之一。聚合仅通过该聚合根上的方法进行操作。这些是前面提到的原子变化。
存储库是对持久存储的抽象,它看起来像是某种类型的所有聚合的集合。对于 Spring Data 一般而言,这意味着您希望Repository每个聚合根都有一个。此外,对于 Spring Data JDBC,这意味着可从聚合根访问的所有实体都被视为该聚合根的一部分。Spring Data JDBC 假定只有聚合具有指向存储聚合的非根实体的表的外键,并且没有其他实体指向非根实体。
在当前的实现中,从聚合根引用的实体被 Spring Data JDBC 删除并重新创建。
您可以使用与您的工作和设计数据库的风格相匹配的实现来覆盖存储库方法。
9.3. 入门
引导设置工作环境的一种简单方法是在STS 中或从Spring Initializr创建一个基于 Spring 的项目。
首先,您需要设置一个正在运行的数据库服务器。请参阅您的供应商文档,了解如何为 JDBC 访问配置数据库。
在 STS 中创建 Spring 项目:
转到 File → New → Spring Template Project → Simple Sprin