|
此版本仍在开发中,尚未被视为稳定版本。如需使用最新的稳定版本,请使用 Spring Data Relational 4.0.4! |
快速开始
一种快速搭建工作环境的简便方法是在Spring Tools中创建一个基于 Spring 的项目,或通过Spring Initializr创建。
首先,您需要设置一个正在运行的数据库服务器。 请参阅您的数据库厂商文档,了解如何为 R2DBC 访问配置数据库。
要求
Spring Data R2DBC 需要 Spring Framework 7.0.6 及以上版本。
就数据库而言,Spring Data R2DBC 需要一个驱动程序,以在特定厂商的 SQL 实现之上抽象出通用的 SQL 功能。 Spring Data R2DBC 直接支持以下数据库:
-
H2 (
io.r2dbc:r2dbc-h2) -
MariaDB (
org.mariadb:r2dbc-mariadb) -
Microsoft SQL Server (
io.r2dbc:r2dbc-mssql) -
MySQL (
io.asyncer:r2dbc-mysql) -
jasync-sql MySQL (
com.github.jasync-sql:jasync-r2dbc-mysql) -
Postgres (
org.postgresql:r2dbc-postgresql) -
Oracle (
com.oracle.database.r2dbc:oracle-r2dbc)
如果你使用了不同的数据库,那么你的应用程序将无法启动。 方言部分包含了在此类情况下如何操作的更多详细信息。
你好,世界
在 STS 中创建一个 Spring 项目:
-
转到 文件(File)→ 新建(New)→ Spring 模板项目(Spring Template Project)→ 简单 Spring 工具项目(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.1.0-M2</version> </dependency> <!-- a R2DBC driver --> <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <version>x.y.z</version> </dependency> </dependencies> -
将 pom.xml 中 Spring 的版本更改为
<spring.version>7.0.6</spring.version> -
在您的
pom.xml文件中添加以下 Spring Milestone 仓库的地址(用于 Maven),使其与<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 文件,使其包含以下内容:
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();
}
}
当你运行主程序时,前面的示例会产生类似于以下的输出:
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]
即使在这个简单的示例中,也有几点需要注意:
-
你可以通过使用标准的
R2dbcEntityTemplate对象来创建 Spring Data R2DBC 中核心辅助类(io.r2dbc.spi.ConnectionFactory)的实例。 -
该映射器可直接作用于标准的 POJO 对象,无需任何额外的元数据(不过,您也可以选择性地提供这些信息——请参见此处。)。
-
映射约定可以使用字段访问。请注意,
Person类只有 getter 方法。 -
如果构造函数参数名称与存储行的列名匹配,则使用这些参数来实例化对象。
示例仓库
有一个GitHub 仓库,其中包含多个示例,您可以下载并试用,以了解该库的工作原理。
使用 Spring 连接关系型数据库
使用关系型数据库和 Spring 时,首要任务之一是通过 IoC 容器创建一个 io.r2dbc.spi.ConnectionFactory 对象。
请确保使用受支持的数据库和驱动程序。
注册一个ConnectionFactory使用 Java 配置创建实例
以下示例展示了如何使用基于 Java 的 bean 元数据来注册一个 io.r2dbc.spi.ConnectionFactory 的实例:
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 支持特性中有详细说明。
AbstractR2dbcConfiguration 还会注册 DatabaseClient,这是数据库交互和 Repository 实现所必需的。
方言
Spring Data R2DBC 使用 R2dbcDialect 来封装特定于数据库或其驱动程序的行为。
Spring Data R2DBC 通过检查 ConnectionFactory 来识别数据库的具体特性,并据此选择合适的数据库方言。
如果您使用的数据库没有对应的方言实现,那么您的应用程序将无法启动。
在这种情况下,您需要请求您的数据库提供商提供一个 R2dbcDialect 实现。
或者,您也可以自行实现自己的 R2dbcDialect。
|
方言由
|