入门
启动一个工作环境的简单方法是在 Spring Tools 中或通过 Spring Initializr 创建一个 Spring 项目。
首先,你需要设置并运行数据库服务器。关于如何配置数据库以进行 R2DBC 访问,请参考你的数据库供应商文档。
要求
Spring Data R2DBC 需要 Spring Framework 6.2.6 及更高版本。
数据库方面,Spring Data R2DBC 需要一个 驱动程序 来抽象通用 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 (
io.r2dbc:r2dbc-postgresql
) -
Oracle (
com.oracle.database.r2dbc:oracle-r2dbc
)
如果你使用不同的数据库,你的应用程序将无法启动。方言 章节包含有关在这种情况下如何操作的更多详细信息。
Hello World
在 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.4.5</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>6.2.6</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
文件,内容如下
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]
即使在这个简单的例子中,也有一些值得注意的地方
-
你可以通过使用一个标准的
io.r2dbc.spi.ConnectionFactory
对象来创建 Spring Data R2DBC 中的核心辅助类(R2dbcEntityTemplate
)的实例。 -
映射器针对标准的 POJO 对象工作,无需任何附加元数据(尽管你可以选择提供该信息 — 详见此处)。
-
映射约定可以使用字段访问。请注意
Person
类只有 getter 方法。 -
如果构造函数参数名称与存储行中的列名匹配,则它们用于实例化对象。
示例 Repository
有一个包含多个示例的 GitHub 仓库,你可以下载并试用,以了解该库的工作原理。
使用 Spring 连接到关系型数据库
使用关系型数据库和 Spring 时,首要任务之一是使用 IoC 容器创建一个 io.r2dbc.spi.ConnectionFactory
对象。确保使用受支持的数据库和驱动程序。
使用 Java 配置注册一个 ConnectionFactory
实例
以下示例展示了如何使用基于 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 使用 Dialect
来封装特定于数据库或其驱动程序的行为。Spring Data R2DBC 通过检查 ConnectionFactory
并相应地选择合适的数据库方言来应对数据库的特定性。如果你使用的数据库没有可用的方言,那么你的应用程序将无法启动。在这种情况下,你必须请你的供应商提供一个 Dialect
实现。或者,你可以实现自己的 Dialect
。
方言由
|