此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Relational 3.4.0! |
开始
引导设置工作环境的一种简单方法是在 Spring Tools 中或从 Spring Initializr 创建基于 Spring 的项目。
首先,您需要设置一个正在运行的数据库服务器。 有关如何配置数据库以进行 R2DBC 访问的信息,请参阅您的供应商文档。
要求
Spring Data R2DBC 需要 Spring Framework 6.2.0 及更高版本。
在数据库方面, 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>3.5.0-SNAPSHOT</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>6.2.0</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
.
方言的解析方式为
|