开始

引导设置工作环境的一种简单方法是在 Spring Tools 中或从 Spring Initializr 创建基于 Spring 的项目。spring-doc.cadn.net.cn

首先,您需要设置一个正在运行的数据库服务器。 有关如何配置数据库以进行 R2DBC 访问的信息,请参阅您的供应商文档。spring-doc.cadn.net.cn

要求

Spring Data R2DBC 需要 Spring Framework 6.2.0 及更高版本。spring-doc.cadn.net.cn

在数据库方面, Spring Data R2DBC 需要一个驱动程序来抽象常见的 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 Template Project → Simple Spring Utility Project,并在出现提示时按 Yes。 然后输入项目和包名称,例如org.spring.r2dbc.example.spring-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.4.0</version>
      </dependency>
    
      <!-- a R2DBC driver -->
      <dependency>
        <groupId>io.r2dbc</groupId>
        <artifactId>r2dbc-h2</artifactId>
        <version>x.y.z</version>
      </dependency>
    
    </dependencies>
  4. 将 Spring 的 pom.xml 版本更改为spring-doc.cadn.net.cn

    <spring.version>6.2.0</spring.version>
  5. 将 Maven 的 Spring Milestone 存储库的以下位置添加到您的pom.xml使其与您的<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.propertiesfile 中包含以下内容: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();
  }
}

当您运行 main 程序时,前面的示例将生成类似于以下内容的输出: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

  • 您可以在 Spring Data R2DBC (R2dbcEntityTemplate) 使用标准io.r2dbc.spi.ConnectionFactory对象。spring-doc.cadn.net.cn

  • Mapper 适用于标准 POJO 对象,无需任何其他元数据(尽管您可以选择提供该信息 — 请参阅此处spring-doc.cadn.net.cn

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

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

示例存储库

有一个 GitHub 存储库,其中包含几个示例,您可以下载并使用这些示例来了解该库的工作原理。spring-doc.cadn.net.cn

使用 Spring 连接到关系数据库

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

注册ConnectionFactory使用 Java 配置的实例

以下示例显示了使用基于 Java 的 bean 元数据注册io.r2dbc.spi.ConnectionFactory:spring-doc.cadn.net.cn

注册io.r2dbc.spi.ConnectionFactory使用 Java 配置的对象
@Configuration
public class ApplicationConfiguration extends AbstractR2dbcConfiguration {

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

此方法允许您使用标准的io.r2dbc.spi.ConnectionFactory实例,容器使用 Spring 的AbstractR2dbcConfiguration.与注册ConnectionFactory实例,则配置支持还有一个额外的优势,即还为容器提供ExceptionTranslator将 R2DBC 异常转换为 Spring 的可移植DataAccessExceptionhierarchy 中,数据访问类使用@Repository注解。此层次结构和@RepositorySpring 的 DAO 支持功能中进行了描述。spring-doc.cadn.net.cn

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

方言

Spring Data R2DBC 使用Dialect封装特定于数据库或其驱动程序的行为。 Spring Data R2DBC 通过检查ConnectionFactory并相应地选择适当的数据库方言。 如果您使用的数据库没有可用的方言,则您的应用程序将无法启动。 在这种情况下,您必须要求供应商提供Dialect实现。 或者,您也可以实施自己的Dialect.spring-doc.cadn.net.cn

方言的解析方式为DialectResolverConnectionFactory,通常通过检查ConnectionFactoryMetadata. + 您可以让 Spring 自动发现您的R2dbcDialect通过注册一个实现org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider通过META-INF/spring.factories.DialectResolver使用 Spring 的SpringFactoriesLoader. 为此,请执行以下作:spring-doc.cadn.net.cn

  1. 实施您自己的Dialect.spring-doc.cadn.net.cn

  2. 实施R2dbcDialectProvider返回Dialect.spring-doc.cadn.net.cn

  3. 通过创建spring.factoriesresource 下的META-INF并通过添加一行来执行注册
    org.springframework.data.r2dbc.dialect.DialectResolver$R2dbcDialectProvider=<fully qualified name of your R2dbcDialectProvider>spring-doc.cadn.net.cn