一、概述
1.1简介
R2DBC基于Reactive Streams反应流规范,它是一个开放的规范,为驱动程序供应商和使用方提供接口(r2dbc-spi),与JDBC的阻塞特性不同,它提供了完全反应式的非阻塞API与关系型数据库交互。
简单说,R2DBC项目是支持使用反应式编程API访问关系型数据库的桥梁,定义统一接口规范,不同数据库厂家通过实现该规范提供驱动程序包。
R2DBC定义了所有数据存储驱动程序必须实现的SPI,目前实现R2DBC SPI的驱动程序包括:- r2dbc-h2:为H2实现的驱动程序;
- r2dbc mariadb:为Mariadb实现的驱动程序;
- r2dbc mssql:为Microsoft SQL Server实现的本机驱动程序;
- r2dbc mysql:为Mysql实现的驱动程序;
- r2dbc postgres:为PostgreSQL实现的驱动程序;
同时,r2dbc还提供反应式连接池r2dbc-pool(https://github.com/r2dbc/r2dbc-pool)。
相关文档
https://doc.qzxdp.cn/spring/spring-data-r2dbc.html
1.2R2DBC历史
首先大家要知道,我们最常使用的 JDBC 其实是同步的,而我们使用 WebFlux 的目的是为了通过异步的方式来提高服务端的响应效率,WebFlux 虽然实现了异步,但是由于 JDBC 还是同步的,而大部分应用都是离不开数据库的,所以其实效率本质上还是没有提升。
那么怎么办呢?有没有异步的 JDBC 呢?有!
目前市面上异步 JDBC 主要是两种:
-
ADAB:ADBA 是 Oracle 主导的 Java 异步数据库访问的标准 API,它将会集成于未来的 Java 标准发行版中。但是目前发展比较慢,只提供 OpenJDK 的沙盒特性供开发者研究之用。
-
R2DBC:R2DBC 是 Spring 官方在 Spring5 发布了响应式 Web 框架 Spring WebFlux 之后急需能够满足异步响应的数据库交互 API,不过由于缺乏标准和驱动,Pivotal 团队开始自己研究响应式关系型数据库连接 Reactive Relational Database Connectivity,并提出了 R2DBC 规范 API 用来评估可行性并讨论数据库厂商是否有兴趣支持响应式的异步非阻塞驱动程序。最早只有 PostgreSQL 、H2、MSSQL 三家数据库厂商,不过现在 MySQL 也加入进来了,这是一个极大的利好。目前 R2DBC 的最新版本是 0.9.0.RELEASE。
需要注意的是,这两个都不是对原来 JDBC 的补充,都是打算重新去设计数据库访问方案!
二、快速入门
2.1原生API使用
https://r2dbc.io
导入依赖
<dependency>
<groupId>io.asyncer</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>1.0.5</version>
</dependency>
测试
//0、MySQL配置
MySqlConnectionConfiguration configuration = MySqlConnectionConfiguration.builder()
.host("localhost")
.port(3306)
.username("root")
.password("123456")
.database("test")
.build();
//1、获取连接工厂
MySqlConnectionFactory connectionFactory = MySqlConnectionFactory.from(configuration);
//2、获取到连接,发送sql
// JDBC: Statement: 封装sql的
//3、数据发布者
Mono.from(connectionFactory.create())
.flatMapMany(connection ->
connection
.createStatement("select * from t_author where id=?id and name=?name")
.bind("id",1L) //具名参数
.bind("name","张三")
.execute()
).flatMap(result -> {
return result.map(readable -> {
Long id = readable.get("id", Long.class);
String name = readable.get("name", String.class);
return new TAuthor(id, name);
});
})
.subscribe(tAuthor -> System.out.println("tAuthor = " + tAuthor))
;
2.2Spring Data R2DBC整合
maven依赖
<!-- https://mvnrepository.com/artifact/io.asyncer/r2dbc-mysql -->
<dependency>
<groupId>io.asyncer</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>1.0.5</version>
</dependency>
<!-- 响应式 Spring Data R2dbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
yml配置
spring:
r2dbc:
url: r2dbcs:mysql://:3306/2046204601
username: 2046204601
password: 2046204601
pool:
enabled: true
initial-size: 1
validation-query: select 1
sql:
init:
mode: always
jackson:
default-property-inclusion: non_null # 序列化时忽略空属性值
logging:
level:
sql: debug
web: debug
com:
example: debug
pattern:
console: '%-5level %C.%M[%line] - %msg%n'
my:
secretkey: '636eac2534bcfcc0'
启动类
* SpringBoot 对r2dbc的自动配置
* 1、R2dbcAutoConfiguration: 主要配置连接工厂、连接池
*
* 2、R2dbcDataAutoConfiguration: 主要给用户提供了 R2dbcEntityTemplate 可以进行CRUD操作
* R2dbcEntityTemplate: 操作数据库的响应式客户端;提供CruD api ; RedisTemplate XxxTemplate
* 数据类型映射关系、转换器、自定义R2dbcCustomConversions 转换器组件
* 数据类型转换:int,Integer; varchar,String; datetime,Instant
*
*
*
* 3、R2dbcRepositoriesAutoConfiguration: 开启Spring Data声明式接口方式的CRUD;
* mybatis-plus: 提供了 BaseMapper,IService;自带了CRUD功能;
* Spring Data: 提供了基础的CRUD接口,不用写任何实现的情况下,可以直接具有CRUD功能;
*
*
* 4、R2dbcTransactionManagerAutoConfiguration: 事务管理
*
*/
@SpringBootApplication
public class R2DBCMainApplication {
public static void main(String[] args) {
SpringApplication.run(R2DBCMainApplication.class,args);
}
}
测试
//1、Spring Data R2DBC,基础的CRUD用 R2dbcRepository 提供好了
//2、自定义复杂的SQL(单表): @Query;
//3、多表查询复杂结果集: DatabaseClient 自定义SQL及结果封装;
//Spring Data 提供的两个核心底层组件
@Autowired // join查询不好做; 单表查询用
R2dbcEntityTemplate r2dbcEntityTemplate; //CRUD API; 更多API操作示例: https://docs.spring.io/spring-data/relational/reference/r2dbc/entity-persistence.html
@Autowired //贴近底层,join操作好做; 复杂查询好用
DatabaseClient databaseClient; //数据库客户端
@Autowired// 导入R2dbcCustomConversions类,用于自定义R2DBC的转换器
R2dbcCustomConversions r2dbcCustomConversions;
@Test
void r2dbcEntityTemplate() throws IOException {
// Query By Criteria: QBC
//1、Criteria构造查询条件 where id=1 and name=张三
Criteria criteria = Criteria
.empty()
.and("id").is(1L)
.and("name").is("张三");
//2、封装为 Query 对象
Que
R2DBC实战指南

最低0.47元/天 解锁文章
1474

被折叠的 条评论
为什么被折叠?



