此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Relational 3.4.5! |
开始
引导设置工作环境的一种简单方法是在 Spring Tools 中或从 Spring Initializr 创建基于 Spring 的项目。
首先,您需要设置一个正在运行的数据库服务器。 有关如何配置数据库以进行 R2DBC 访问的信息,请参阅您的供应商文档。
要求
Spring Data R2DBC 需要 Spring Framework 7.0.0-M4 及更高版本。
在数据库方面, Spring Data R2DBC 需要一个驱动程序来抽象常见的 SQL 功能,而不是特定于供应商的风格。 Spring Data R2DBC 包括对以下数据库的直接支持:
-
H2 系列 (
io.r2dbc:r2dbc-h2
) -
MariaDB的 (
org.mariadb:r2dbc-mariadb
) -
Microsoft SQL 服务器 (
io.r2dbc:r2dbc-mssql
) -
MySQL (MySQL的 (
io.asyncer:r2dbc-mysql
) -
jasync-sql MySQL (
com.github.jasync-sql:jasync-r2dbc-mysql
) -
Postgres (
io.r2dbc:r2dbc-postgresql
) -
神谕 (
com.oracle.database.r2dbc:oracle-r2dbc
)
如果您使用其他数据库,则您的应用程序将无法启动。 方言部分包含有关如何在这种情况下进行的更多详细信息。
世界您好
要在 STS 中创建 Spring 项目,请执行以下作:
-
转到 File → New → Spring Template Project → Simple Spring Utility Project,并在出现提示时按 Yes。 然后输入项目和包名称,例如
org.spring.r2dbc.example
. -
将以下内容添加到
pom.xml
文件dependencies
元素: -
将以下内容添加到 pom.xml 文件中
dependencies
元素:<dependencies> <!-- other dependency elements omitted --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-r2dbc</artifactId> <version>4.0.0-M2</version> </dependency> <!-- a R2DBC driver --> <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <version>x.y.z</version> </dependency> </dependencies>
-
将 Spring 的 pom.xml 版本更改为
<spring.version>7.0.0-M4</spring.version>
-
将 Maven 的 Spring Milestone 存储库的以下位置添加到您的
pom.xml
使其与您的<dependencies/>
元素:<repositories> <repository> <id>spring-milestone</id> <name>Spring Maven MILESTONE Repository</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories>
存储库也可以在此处浏览。
您可能还需要将日志记录级别设置为DEBUG
以查看一些其他信息。
为此,请编辑application.properties
file 中包含以下内容:
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();
}
}
当您运行 main 程序时,前面的示例将生成类似于以下内容的输出:
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 Data R2DBC (
R2dbcEntityTemplate
) 使用标准io.r2dbc.spi.ConnectionFactory
对象。 -
Mapper 适用于标准 POJO 对象,无需任何其他元数据(尽管您可以选择提供该信息 — 请参阅此处。
-
映射约定可以使用字段访问。请注意,
Person
class 只有 getter。 -
如果构造函数参数名称与存储行的列名匹配,则它们用于实例化对象。
示例存储库
有一个 GitHub 存储库,其中包含几个示例,您可以下载并使用这些示例来了解该库的工作原理。
使用 Spring 连接到关系数据库
使用关系数据库和 Spring 时,首要任务之一是创建一个io.r2dbc.spi.ConnectionFactory
object 的 IoC 容器。
确保使用支持的数据库和驱动程序。
注册ConnectionFactory
使用 Java 配置的实例
以下示例显示了使用基于 Java 的 bean 元数据注册io.r2dbc.spi.ConnectionFactory
:
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 的可移植DataAccessException
hierarchy 中,数据访问类使用@Repository
注解。此层次结构和@Repository
在 Spring 的 DAO 支持功能中进行了描述。
AbstractR2dbcConfiguration
还注册DatabaseClient
,这是数据库交互和 Repository 实施所必需的。
方言
Spring Data R2DBC 使用Dialect
封装特定于数据库或其驱动程序的行为。
Spring Data R2DBC 通过检查ConnectionFactory
并相应地选择适当的数据库方言。
如果您使用的数据库没有可用的方言,则您的应用程序将无法启动。
在这种情况下,您必须要求供应商提供Dialect
实现。
或者,您也可以实施自己的Dialect
.
方言的解析方式为
|