このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Data Relational 4.1.1 を使用してください! |
入門
作業環境をブートストラップ設定する簡単な方法は、Pleiades All in One (JDK, STS, Lombok 付属) 、Spring Tools (英語) または Spring Initializr から Spring ベースのプロジェクトを作成することです。
まず、実行中のデータベースサーバーをセットアップする必要があります。R2DBC アクセス用にデータベースを構成する方法については、ベンダーのドキュメントを参照してください。
要件
Spring Data R2DBC には Spring Framework 7.1.0-M1 以降が必要です。
データベースに関して言えば、Spring Data R2DBC はベンダー固有の SQL 機能の上に共通の SQL 機能を抽象化するドライバを必要とします。Spring Data R2DBC は以下のデータベースを直接サポートしています。
H2 [GitHub] (英語) (
io.r2dbc:r2dbc-h2)MariaDB [GitHub] (英語) (
org.mariadb:r2dbc-mariadb)Microsoft SQL Server [GitHub] (英語) (
io.r2dbc:r2dbc-mssql)MySQL [GitHub] (英語) (
io.asyncer:r2dbc-mysql)jasync-sql MySQL [GitHub] (英語) (
com.github.jasync-sql:jasync-r2dbc-mysql)Postgres [GitHub] (英語) (
org.postgresql:r2dbc-postgresql)Oracle [GitHub] (英語) (
com.oracle.database.r2dbc:oracle-r2dbc)
別のデータベースを使用すると、アプリケーションは起動しません。このような場合の対処方法については、ダイアレクトのセクションに詳しく記載されています。
Hello World
STS で Spring プロジェクトを作成するには:
ファイル→新規→ Spring テンプレートプロジェクト→シンプル Spring ユーティリティプロジェクトに移動し、プロンプトが表示されたらはいを押します。次に、プロジェクトとパッケージ名(
org.spring.r2dbc.exampleなど)を入力します。pom.xmlファイルのdependencies要素に以下を追加します。<dependencies> <!-- other dependency elements omitted --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-r2dbc</artifactId> <version>4.2.0-M1</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.1.0-M1</spring.version>Maven の Spring マイルストーンリポジトリの次の場所を、
<dependencies/>要素と同じレベルになるようにpom.xmlに追加します。<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 ework.core.DatabaseClient: 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 ework.core.DatabaseClient: 908 - Executing SQL statement [INSERT INTO person (id, name, age) VALUES($1, $2, $3)]
2018-11-28 10:47:04,092 DEBUG ework.core.DatabaseClient: 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 しかありません。コンストラクターの引数名が保存された行の列名と一致する場合、オブジェクトのインスタンス化に使用されます。
サンプルリポジトリ
GitHub リポジトリといくつかの例 (英語) をダウンロードして試して、ライブラリの動作を確認してください。
Spring を使用したリレーショナルデータベースへの接続
リレーショナルデータベースと Spring を使用する場合の最初のタスクの 1 つは、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 インスタンスを直接登録する場合と比較して、構成サポートには、R2DBC 例外を Spring の例外に変換する ExceptionTranslator 実装もコンテナーに提供するという追加の利点があります。@Repository アノテーションが付けられたデータアクセスクラスのポータブル DataAccessException 階層。この階層と @Repository の使用については、Spring の DAO サポート機能で説明されています。
AbstractR2dbcConfiguration は、DatabaseClient も登録します。これは、データベースの相互作用およびリポジトリの実装に必要です。
ダイアレクト
Spring Data R2DBC は、R2dbcDialect を使用して、データベースまたはそのドライバーに固有の動作をカプセル化します。Spring Data R2DBC は、ConnectionFactory をインスペクションすることでデータベースの詳細に反応し、それに応じて適切なデータベース言語を選択します。使用可能なダイアレクトがないデータベースを使用すると、アプリケーションは起動しません。その場合、ベンダーに R2dbcDialect 実装の提供を依頼する必要があります。あるいは、独自の R2dbcDialect を実装することもできます。
ダイアレクトは、通常
|