跳到主要内容

快速开始

DeepSeek V3 中英对照 Getting Started

在 Spring Tools 或 Spring Initializr 中创建一个基于 Spring 的项目是快速搭建工作环境的便捷方式。

首先,您需要设置一个正在运行的数据库服务器。请参考您的供应商文档,了解如何为 R2DBC 访问配置数据库。

需求​

Spring Data R2DBC 需要 Spring Framework 6.2.3 及以上版本。

在数据库方面,Spring Data R2DBC 需要一个驱动程序来抽象出针对不同供应商的 SQL 功能。Spring Data R2DBC 直接支持以下数据库:

如果你使用了不同的数据库,你的应用程序将无法启动。dialect 部分详细介绍了在这种情况下如何继续操作。

Hello World​

在 STS 中创建 Spring 项目:

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

  2. 在 pom.xml 文件的 <dependencies> 元素中添加以下内容:

  3. 在 pom.xml 文件的 <dependencies> 元素中添加以下内容:

    <dependencies>

    <!-- 其他依赖元素已省略 -->

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

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

    </dependencies>
  4. 在 pom.xml 中将 Spring 的版本更改为:

    <spring.version>6.2.3</spring.version>
  5. 在 pom.xml 中添加 Spring Milestone 仓库的位置,使其与 <dependencies/> 元素位于同一层级:

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

该仓库也可以在此处浏览。

您可能还希望将日志级别设置为 DEBUG 以查看一些额外的信息。为此,请编辑 application.properties 文件,使其包含以下内容:

logging.level.org.springframework.r2dbc=DEBUG

然后,你可以创建一个 Person 类来进行持久化,如下所示:

public class Person {

private final String id;
private final String name;
private final int age;

public Person(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

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

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

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

import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import reactor.test.StepVerifier;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;

public class R2dbcApp {

private static final Log log = LogFactory.getLog(R2dbcApp.class);

public static void main(String[] args) {

ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:mem:///test?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");

R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);

template.getDatabaseClient().sql("CREATE TABLE person" +
"(id VARCHAR(255) PRIMARY KEY," +
"name VARCHAR(255)," +
"age INT)")
.fetch()
.rowsUpdated()
.as(StepVerifier::create)
.expectNextCount(1)
.verifyComplete();

template.insert(Person.class)
.using(new Person("joe", "Joe", 34))
.as(StepVerifier::create)
.expectNextCount(1)
.verifyComplete();

template.select(Person.class)
.first()
.doOnNext(it -> log.info(it))
.as(StepVerifier::create)
.expectNextCount(1)
.verifyComplete();
}
}

当您运行主程序时,前面的示例会产生类似如下的输出:

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 对象,无需任何额外的元数据(不过你可以选择提供这些信息,参见此处)。

  • 映射约定可以使用字段访问。注意 Person 类只有 getter 方法。

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

示例仓库​

这里有一个 GitHub 仓库,包含多个示例,你可以下载并尝试这些示例,以更好地了解该库的工作原理。

使用 Spring 连接到关系型数据库​

在使用关系型数据库和 Spring 时,首要任务之一是通过 IoC 容器创建一个 io.r2dbc.spi.ConnectionFactory 对象。确保使用支持的数据库和驱动。

使用 Java 配置注册 ConnectionFactory 实例​

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

@Configuration
public class ApplicationConfiguration extends AbstractR2dbcConfiguration {

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

这种方法允许你使用标准的 io.r2dbc.spi.ConnectionFactory 实例,同时容器使用 Spring 的 AbstractR2dbcConfiguration。与直接注册 ConnectionFactory 实例相比,配置支持还提供了一个额外的优势,即为容器提供了一个 ExceptionTranslator 实现,该实现将 R2DBC 异常转换为 Spring 可移植的 DataAccessException 层次结构中的异常,适用于使用 @Repository 注解标注的数据访问类。关于这一层次结构以及 @Repository 的使用,可以在 Spring 的 DAO 支持特性 中找到详细描述。

AbstractR2dbcConfiguration 还会注册 DatabaseClient,这是进行数据库交互以及实现 Repository 所必需的。

方言​

Spring Data R2DBC 使用 Dialect 来封装特定于数据库或其驱动程序的行为。Spring Data R2DBC 通过检查 ConnectionFactory 来响应数据库的特定需求,并相应地选择适当的数据库方言。如果你使用的数据库没有可用的方言,那么你的应用程序将无法启动。在这种情况下,你需要向你的供应商请求提供一个 Dialect 实现。或者,你也可以自己实现一个 Dialect。

提示

方言通过 DialectResolver 从 ConnectionFactory 中解析,通常通过检查 ConnectionFactoryMetadata 来实现。 + 你可以让 Spring 自动发现你的 R2dbcDialect,方法是通过 META-INF/spring.factories 注册一个实现了 org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider 的类。DialectResolver 使用 Spring 的 SpringFactoriesLoader 从类路径中发现方言提供者实现。具体步骤如下:

  1. 实现你自己的 Dialect。

  2. 实现一个 R2dbcDialectProvider,返回该 Dialect。

  3. 通过在 META-INF 下创建一个 spring.factories 资源来注册提供者,并通过添加一行
    org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider=<你的 R2dbcDialectProvider 的完全限定名> 来完成注册。