1. 简介

三月份已经介绍过R2DBC,它是一种异步的、非阻塞的关系式数据库连接规范。尽管一些NoSQL数据库供应商为其数据库提供了反应式数据库客户端,但对于大多数项目而言,迁移到NoSQL并不是一个理想的选择。这促使了一个通用的响应式关系数据库连接规范的诞生。 作为拥有庞大用户群的关系式数据库MySQL也有了反应式驱动,不过并不是官方的。但是Spring官方将其纳入了依赖池,说明该类库的质量并不低。所以今天就尝尝鲜,试一下使用R2DBC连接MySQL

2. 环境依赖

基于Spring Boot 2.3.1Spring Data R2DBC,还有反应式Web框架Webflux,同时也要依赖r2dbc-mysql库,所有的Maven依赖为:

       <!--r2dbc mysql 库-->
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
</dependency>
<!--Spring r2dbc 抽象层-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<!--自动配置需要引入的一个嵌入式数据库类型对象-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--反应式web框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

MySQL版本为5.7,没有测试其它版本。

3. R2DBC配置

所有的R2DBC自动配置都在org.springframework.boot.autoconfigure.data.r2dbc包下,如果要配置MySQL必须针对性的配置对应的连接工厂接口ConnectionFactory,当然也可以通过application.yml配置。个人比较喜欢JavaConfig

@Bean
ConnectionFactory connectionFactory() {
return MySqlConnectionFactory.from(MySqlConnectionConfiguration.builder()
.host("127.0.0.1")
.port(3306)
.username("root")
.password("123456")
.database("database_name")
// 额外的其它非必选参数省略
.build());
}

详细配置可参考r2dbc-mysql的官方说明:https://github.com/mirromutth/r2dbc-mysql

ConnectionFactory配置好后,就会被注入DatabaseClient 对象。该对象是非阻塞的,用于执行数据库反应性客户端调用与反应流背压请求。我们可以通过该接口反应式地操作数据库。

4. 编写反应式接口

我们先创建一张表并写入一些数据:

create table client_user
(
user_id varchar(64) not null comment '用户唯一标示' primary key,
username varchar(64) null comment '名称',
phone_number varchar(64) null comment '手机号',
gender tinyint(1) default 0 null comment '0 未知 1 男 2 女 '
)

对应的实体为:

package cn.felord.r2dbc.config;

import lombok.Data;

/**
* @author felord.cn
*/
@Data
public class ClientUser { private String userId;
private String username;
private String phoneNumber;
private Integer gender;
}

然后我们编写一个Webflux的反应式接口:

package cn.felord.r2dbc.config;

import org.springframework.data.r2dbc.core.DatabaseClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import javax.annotation.Resource; /**
* The type User controller.
*
* @author felord.cn
* @since 17 :07
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private DatabaseClient databaseClient; /**
* 查询
*
* @return 返回Flux序列 包含所有的ClientUser
*/
@GetMapping("/get")
public Flux<ClientUser> clientUserFlux() {
return databaseClient.execute("select * from client_user").as(ClientUser.class)
.fetch()
.all();
} /**
* 响应式写入.
*
* @return Mono对象包含更新成功的条数
*/
@GetMapping("/add")
public Mono<Integer> insert() {
ClientUser clientUser = new ClientUser();
clientUser.setUserId("34345514644");
clientUser.setUsername("felord.cn");
clientUser.setPhoneNumber("3456121");
clientUser.setGender(1); return databaseClient.insert().into(ClientUser.class)
.using(clientUser)
.fetch().rowsUpdated();
} }

调用接口就能获取到期望的数据结果。

5. 总结

乍一看R2DBC并没有想象中的那么难,但是间接的需要了解FluxMono等抽象概念。同时目前来说如果不和Webflux框架配合也没有使用场景。就本文的MySQL而言,R2DBC驱动还是社区维护(不得不说PgSQL就做的很好)。

然而需要你看清的是反应式才是未来。如果你要抓住未来就需要现在就了解一些相关的知识。这让我想起五年前刚刚接触Spring Boot的感觉。另外这里有一份Spring官方关于R2DBC的PPT,也是让你更好了解R2DBC的权威资料。可以关注:码农小胖哥 回复r2dbc获取。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

使用反应式关系数据库连接规范R2DBC操作MySQL数据库的更多相关文章

  1. Go语言操作MySQL数据库

    Go语言操作MySQL数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用 ...

  2. 【转】python操作mysql数据库

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...

  3. python接口自动化(三十八)-python操作mysql数据库(详解)

    简介 现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会不会搭建测试系统,会不会常用的数据库, ...

  4. 【tips】ORM - SQLAlchemy操作MySQL数据库

    优先(官方文档SQLAlchemy-version1.2): sqlalchemy | 作者:斯芬克斯 推荐一(长篇幅version1.2.0b3):python约会之ORM-sqlalchemy | ...

  5. Python 操作MySQL 数据库

    Python 操作 MySQL 数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的 ...

  6. Dapper操作MySQL数据库获取JSON数据中文乱码

    前言 在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正. Dapper获取J ...

  7. 【php】php操作MySQL数据库

    一.操作步骤: 1. 连接MySQL数据库并判断是否连接成功2. 选择数据库3. 设置字符集4. 准备SQL语句5. 向MySQL服务发送SQL语句6. 解析处理结果集7. 释放结果集,关闭数据库连接 ...

  8. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  9. PHP操作mysql数据库:[2]查询数据听语音

    本文主要详细讲解如何使用php语言,对mysql数据库进行查询.添加.删除.更新等操作. 工具/原料   Macromedia Dreamweaver 8 mysql数据库,php语言 一.前言   ...

随机推荐

  1. cypher语句摘要

    match(n) return n 返回所有的节点和关系,只要有就返回,对节点和关系的查找不做条件限制. match(n:Student) return n 返回所有的Student节点 创建节点:c ...

  2. CAD文件打印为PDF文档

    标题: CAD文件打印为PDF文档 作者: 梦幻之心星 347369787@QQ.com 标签: [CAD, 打印, 转换] 目录: 软件 日期: 2019-5-28 目录 CAD文件打印为PDF文档 ...

  3. 14 . Python3之MysSQL

    数据库概念 数据库: 按照数据结构来组织.存储.管理数据的仓库` 诞生 计算机的发明是为了做科学计算的,而科学计算需要大量的输入和输出. 早期,可以使用打孔卡片的孔.灯泡的亮灭表示数据输入,输出. 后 ...

  4. 如何发布一个 npm 包

    一 背景 在工作时,突然接到经理的一个要求,需要将一个react的高阶组件函数封装成一个npm包.之前从没弄过,当场还是有些懵逼的,但是这毕竟是工作,不能推脱.于是开始了学习.汤坑之旅.最终包发布,线 ...

  5. 分布式事务专题笔记(三)分布式事务解决方案之TCC(三阶段提交)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.什么是TCC事务 TCC是Try.Confifirm.Cancel三个词语的缩写,TCC要求每个分支 ...

  6. JavaScript (四) js的基本语法 - - 函数练习、arguments、函数定义、作用域、预解析

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.函数练习 1.求最值 // - 求2个数中的最大值 function getMax(num1, nu ...

  7. Java实现 LeetCode 781 森林中的兔子(分析题)

    781. 森林中的兔子 森林中,每个兔子都有颜色.其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色.我们将这些回答放在 answers 数组里. 返回森林中兔子的最少数量. 示例: ...

  8. Java实现 蓝桥杯VIP 算法训练 P1101

    有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输出提货单的 ...

  9. java实现亲密数

    假设有 a.b 两个数,若 a 的所有因子之和等于 b,b 的所有因子之和等于 a, 并且 a 不等于 b,则称 a 和 b 是一对亲密数.如 284 和 220 就是一对亲密数. 分析: 若要找出 ...

  10. Java实现 蓝桥杯 算法提高 矩阵翻转

    问题描述 Ciel有一个N*N的矩阵,每个格子里都有一个整数. N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从矩阵选出一个X*X的子矩阵,并将这个子矩阵中的所有整数都 ...