跳到主要内容

快速开始

DeepSeek V3 中英对照 Getting Started

Spring ToolsSpring 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>
    xml
  4. pom.xml 中将 Spring 的版本更改为:

    <spring.version>6.2.3</spring.version>
    xml
  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>
    xml

该仓库也可以在此处浏览

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

logging.level.org.springframework.r2dbc=DEBUG
none

然后,你可以创建一个 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 + "]";
}
}
java

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

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

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

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();
}
}
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]
none

即使在这个简单的例子中,也有几点需要注意:

  • 你可以使用标准的 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
}
}
java

这种方法允许你使用标准的 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

提示

方言通过 DialectResolverConnectionFactory 中解析,通常通过检查 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 的完全限定名> 来完成注册。