Getting Started

启动工作环境的简单方法是在 Spring Tools 中或从 Spring Initializr 中创建一个基于 Spring 的项目。 首先,你需要设置一个正在运行的数据库服务器。有关如何配置数据库以进行 R2DBC 访问,请参阅供应商文档。

Requirements

Spring Data R2DBC 需要 Spring Framework {springVersion} 及更高版本。

在数据库方面,Spring Data R2DBC 需要一个 [驱动程序,r2dbc.drivers] 来对特定于供应商的功能与通用 SQL 功能进行抽象。Spring Data R2DBC 包括对以下数据库的直接支持:

如果您使用其他数据库,那么应用程序将无法启动。[方言,r2dbc.dialects] 部分包含有关在这种情况下如何继续进行的更多详细信息。

Hello World

如何在 STS 中创建 Spring 项目:

  1. 转到文件 → 新建 → Spring 模板项目 → 简单 Spring 实用程序项目,并在提示时按是。然后输入项目和包名,例如 org.spring.r2dbc.example

  2. 将以下内容添加到 pom.xml 文件 dependencies 元素中:

  3. 将以下内容添加到 pom.xml 文件 dependencies 元素中:[source, xml]

<dependencies>

  <!-- other dependency elements omitted -->

  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-r2dbc</artifactId>
    <version>{version}</version>
  </dependency>

  <!-- a R2DBC driver -->
  <dependency>
    <groupId>io.r2dbc</groupId>
    <artifactId>r2dbc-h2</artifactId>
    <version>x.y.z</version>
  </dependency>

</dependencies>
  1. 将 pom.xml 中 Spring 版本更改为[source, xml]

<spring.version>{springVersion}</spring-framework.version>
  1. 将以下 Spring Milestone 存储库位置添加到您的 pom.xml 中,使其位于与 &lt;dependencies/&gt; 元素相同的级别:[source, xml]

<repositories>
  <repository>
    <id>spring-milestone</id>
    <name>Spring Maven MILESTONE Repository</name>
    <url>https://repo.spring.io/milestone</url>
  </repository>
</repositories>

存储库也是 browseable here

您可能还想将日志级别设置为 DEBUG 以查看一些其他信息。为此,请编辑 application.properties 文件,使文件具有以下内容:

logging.level.org.springframework.r2dbc=DEBUG

然后,您可以(例如)创建一个 Person 类来持久化,如下所示:

Unresolved include directive in modules/ROOT/pages/r2dbc/getting-started.adoc - include::example$r2dbc/Person.java[]

接下来,您需要在数据库中创建表结构,如下所示:

CREATE TABLE person
  (id VARCHAR(255) PRIMARY KEY,
   name VARCHAR(255),
   age INT);

您还需要一个主应用程序来运行,如下所示:

Unresolved include directive in modules/ROOT/pages/r2dbc/getting-started.adoc - include::example$r2dbc/R2dbcApp.java[]

当您运行主程序时,前面的示例将产生类似于以下内容的输出:

2018-11-28 10:47:03,893 DEBUG amework.core.r2dbc.DefaultDatabaseClient: 310 - Executing SQL statement [CREATE TABLE person
  (id VARCHAR(255) PRIMARY KEY,
   name VARCHAR(255),
   age INT)]
2018-11-28 10:47:04,074 DEBUG amework.core.r2dbc.DefaultDatabaseClient: 908 - Executing SQL statement [INSERT INTO person (id, name, age) VALUES($1, $2, $3)]
2018-11-28 10:47:04,092 DEBUG amework.core.r2dbc.DefaultDatabaseClient: 575 - Executing SQL statement [SELECT id, name, age FROM person]
2018-11-28 10:47:04,436  INFO        org.spring.r2dbc.example.R2dbcApp:  43 - Person [id='joe', name='Joe', age=34]

即便在这个简单的示例中,也有一些需要注意的地方:

  • 您可以使用标准 io.r2dbc.spi.ConnectionFactory 对象在 Spring Data R2DBC (R2dbcEntityTemplate) 中创建中心帮助程序类的实例。

  • 映射程序针对标准 POJO 对象工作,无需任何附加元数据(但您可以选择提供该信息 - 参阅 here)。

  • 映射惯例可以使用字段访问。请注意,Person 类只有 getter。

  • 如果构造函数参数名称与存储的行中的列名称匹配,它们将用于实例化对象。

Examples Repository

有一个 GitHub repository with several examples 供您下载和使用,以便了解该库的工作原理。

Connecting to a Relational Database with Spring

使用关系型数据库和 Spring 时的首要任务之一是使用 IoC 容器创建 io.r2dbc.spi.ConnectionFactory 对象。请务必使用 [受支持的数据库和驱动程序,requirements]

Registering a ConnectionFactory Instance using Java Configuration

以下示例演示了使用基于 Java 的 bean 元数据来注册 io.r2dbc.spi.ConnectionFactory 实例:

Registering a io.r2dbc.spi.ConnectionFactory object using Java Configuration
@Configuration
public class ApplicationConfiguration extends AbstractR2dbcConfiguration {

  @Override
  @Bean
  public ConnectionFactory connectionFactory() {
    return …
  }
}

这种方法让您可以使用标准 io.r2dbc.spi.ConnectionFactory 实例,容器使用 Spring 的 AbstractR2dbcConfiguration。与直接注册 ConnectionFactory 实例相比,该配置支持具有提供容器 ExceptionTranslator 实现的附加优势,该实现将 R2DBC 异常转换为 Spring 中带有 @Repository 注释的数据访问类中的 DataAccessException 等级结构中的异常。Spring 的 DAO 支持功能中描述了此层次结构和 @Repository 的使用。

AbstractR2dbcConfiguration 还会注册 DatabaseClient,这对于数据库交互和 Repository 实现而言是必需的。

Dialects

Spring Data R2DBC 使用 Dialect 封装特定于数据库或其驱动程序的行为。通过检查 ConnectionFactory,Spring Data R2DBC 响应数据库细节,并相应选择合适的数据库方言。如果您使用的是没有方言的数据库,那么您的应用程序将无法启动。在那种情况下,您将必须要求您的供应商提供 Dialect 实现。或者,您可以实现自己的 Dialect

方言由 {spring-data-r2dbc-javadoc}/org/springframework/data/r2dbc/dialect/DialectResolver.html[DialectResolver] 根据 ConnectionFactory`解析,通常是通过检查 `ConnectionFactoryMetadata。+ 你可以通过通过 META-INF/spring.factories`注册实现 `org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider`的类来让 Spring 自动发现你的 `R2dbcDialect。`DialectResolver`使用 Spring 的 `SpringFactoriesLoader`从类路径发现方言提供程序实现。为此:

  1. Implement your own Dialect.

  2. 实现返回 DialectR2dbcDialectProvider

  3. 通过在 META-INF 下创建 spring.factories 资源注册提供程序,并通过添加一行 org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider=<fully qualified name of your R2dbcDialectProvider> 来执行注册