对于最新的稳定版本,请使用 Spring Data Relational 4.0.4spring-doc.cadn.net.cn

快速开始

一种快速搭建工作环境的简便方法是在Spring Tools中创建一个基于 Spring 的项目,或通过Spring Initializr创建。spring-doc.cadn.net.cn

首先,您需要设置一个正在运行的数据库服务器。 请参阅您的数据库厂商文档,了解如何为 R2DBC 访问配置数据库。spring-doc.cadn.net.cn

要求

Spring Data R2DBC 需要 Spring Framework 6.2.17 及以上版本。spring-doc.cadn.net.cn

就数据库而言,Spring Data R2DBC 需要一个驱动程序,以在特定厂商的 SQL 实现之上抽象出通用的 SQL 功能。 Spring Data R2DBC 直接支持以下数据库:spring-doc.cadn.net.cn

如果你使用了不同的数据库,那么你的应用程序将无法启动。 方言部分包含了在此类情况下如何操作的更多详细信息。spring-doc.cadn.net.cn

你好,世界

在 STS 中创建一个 Spring 项目:spring-doc.cadn.net.cn

  1. 转到 文件(File)→ 新建(New)→ Spring 模板项目(Spring Template Project)→ 简单 Spring 工具项目(Simple Spring Utility Project),并在提示时点击“是(Yes)”。 然后输入项目名称和包名,例如 org.spring.r2dbc.examplespring-doc.cadn.net.cn

  2. 将以下内容添加到 pom.xml 文件的 dependencies 元素中:spring-doc.cadn.net.cn

  3. 将以下内容添加到 pom.xml 文件的 dependencies 元素中:spring-doc.cadn.net.cn

    <dependencies>
    
        <!-- other dependency elements omitted -->
    
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-r2dbc</artifactId>
            <version>3.5.10</version>
        </dependency>
    
        <!-- a R2DBC driver -->
        <dependency>
            <groupId>io.r2dbc</groupId>
            <artifactId>r2dbc-h2</artifactId>
            <version>x.y.z</version>
        </dependency>
    
    </dependencies>
  4. 将 pom.xml 中 Spring 的版本更改为spring-doc.cadn.net.cn

    <spring.version>6.2.17</spring.version>
  5. 在您的 pom.xml 文件中添加以下 Spring Milestone 仓库的地址(用于 Maven),使其与 <dependencies/> 元素处于同一层级:spring-doc.cadn.net.cn

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

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

logging.level.org.springframework.r2dbc=DEBUG

然后,例如,你可以创建一个 Person 类来进行持久化,如下所示:spring-doc.cadn.net.cn

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 + "]";
	}
}

接下来,您需要在数据库中创建如下表结构:spring-doc.cadn.net.cn

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

你还需要一个主应用程序来运行,如下所示:spring-doc.cadn.net.cn

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

当你运行主程序时,前面的示例会产生类似于以下的输出:spring-doc.cadn.net.cn

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]

即使在这个简单的示例中,也有几点需要注意:spring-doc.cadn.net.cn

  • 你可以通过使用标准的 R2dbcEntityTemplate 对象来创建 Spring Data R2DBC 中核心辅助类(io.r2dbc.spi.ConnectionFactory)的实例。spring-doc.cadn.net.cn

  • 该映射器可直接作用于标准的 POJO 对象,无需任何额外的元数据(不过,您也可以选择性地提供这些信息——请参见此处。)。spring-doc.cadn.net.cn

  • 映射约定可以使用字段访问。请注意,Person 类只有 getter 方法。spring-doc.cadn.net.cn

  • 如果构造函数参数名称与存储行的列名匹配,则使用这些参数来实例化对象。spring-doc.cadn.net.cn

示例仓库

有一个GitHub 仓库,其中包含多个示例,您可以下载并试用,以了解该库的工作原理。spring-doc.cadn.net.cn

使用 Spring 连接关系型数据库

使用关系型数据库和 Spring 时,首要任务之一是通过 IoC 容器创建一个 io.r2dbc.spi.ConnectionFactory 对象。 请确保使用受支持的数据库和驱动程序spring-doc.cadn.net.cn

注册一个ConnectionFactory使用 Java 配置创建实例

以下示例展示了如何使用基于 Java 的 bean 元数据来注册一个 io.r2dbc.spi.ConnectionFactory 的实例:spring-doc.cadn.net.cn

使用 Java 配置注册一个 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 支持特性中有详细说明。spring-doc.cadn.net.cn

AbstractR2dbcConfiguration 还会注册 DatabaseClient,这是数据库交互和 Repository 实现所必需的。spring-doc.cadn.net.cn

方言

Spring Data R2DBC 使用 Dialect 来封装特定于数据库或其驱动程序的行为。 Spring Data R2DBC 通过检查 ConnectionFactory 来识别数据库的具体特性,并据此选择合适的数据库方言。 如果您使用的数据库没有对应的方言实现,那么您的应用程序将无法启动。 在这种情况下,您需要请求您的数据库提供商提供一个 Dialect 实现。 或者,您也可以自行实现自己的 Dialectspring-doc.cadn.net.cn

方言(Dialects)由 DialectResolverDialectResolver)根据 ConnectionFactoryMetadata 进行解析,通常是通过检查 R2dbcDialect 来实现的。 + 您可以通过在 org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider 中注册一个实现了 META-INF/spring.factories 接口的类,让 Spring 自动发现您的 DialectResolverSpringFactoriesLoader 使用 Spring 的 8 从类路径中发现方言提供者(dialect provider)的实现。 具体操作如下:spring-doc.cadn.net.cn

  1. 实现您自己的 Dialectspring-doc.cadn.net.cn

  2. 实现一个返回 R2dbcDialectProviderDialectspring-doc.cadn.net.cn

  3. 通过创建来注册提供者spring.factories资源位于META-INF并通过添加一行来执行注册
    org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider=<fully qualified name of your R2dbcDialectProvider>spring-doc.cadn.net.cn