diff --git a/spring/spring data r2dbc/r2dbc.md b/spring/spring data r2dbc/r2dbc.md new file mode 100644 index 0000000..7c46a88 --- /dev/null +++ b/spring/spring data r2dbc/r2dbc.md @@ -0,0 +1,117 @@ +# R2DBC +## Getting Started +### 引入pom +在spring boot项目中,如果要适配spring data r2dbc,可以引入如下pom依赖: +```xml + + org.springframework.boot + spring-boot-starter-data-r2dbc + + + + io.asyncer + r2dbc-mysql + 1.4.1 + +``` +### create pojo & create table +之后,可以创建如下实体: +```java +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 + "]"; + } +} +``` +创建table: +```sql +CREATE TABLE person( + id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255), + age INT +); +``` +### 声明ConnectionFactory +```java +@Configuration +@Slf4j +public class ConnectionFactoryConf extends AbstractR2dbcConfiguration { + @Bean + public ConnectionFactory connectionFactory() { +// ConnectionFactories.get("jdbc:mysql://localhost:3306/innodb_demo?useSSL=false&rewriteBatchedStatements=true") +// . + ConnectionFactoryOptions options = ConnectionFactoryOptions.builder() + .option(ConnectionFactoryOptions.HOST, "localhost") + .option(ConnectionFactoryOptions.PORT, 3306) + .option(ConnectionFactoryOptions.DRIVER, "mysql") + .option(ConnectionFactoryOptions.USER, "rw_all_db") + .option(ConnectionFactoryOptions.PASSWORD, "ab19971025") + .option(ConnectionFactoryOptions.DATABASE, "asahi_schedule") + .build(); + ConnectionPoolConfiguration poolConf = ConnectionPoolConfiguration.builder() + .connectionFactory(ConnectionFactories.get(options)) + .maxSize(10) + .validationQuery("SELECT 1") + .build(); + return new ConnectionPool(poolConf); + } +} +``` +在上述示例中,Conf类继承了AbstractR2dbcConfiguration类,相比于直接注入`connectionFactory`对象,通过AbstractR2dbcConfiguration注册能够提供ExceptionTranslator,将r2dbc中的异常翻译为DataAccessException。 + +### 通过R2dbcEntityTemplate操作数据库 +通过entityTemplate操作数据库的示例如下: +```java +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(); + } +``` +在上述示例中,pojo到table的映射会自动生效,并不需要额外的元数据。 +### Dialects +spring data R2DBC会使用Dialect来对`特定数据库/driver的行为`进行封装。 \ No newline at end of file