build apk没有反应_使用反应式关系数据库链接规范R2DBC操作mysql数据库

896ac5c4799b5606b5c1dd7706759166.png

1. 简介

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

2. 环境依赖

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

               dev.miku            r2dbc-mysql        org.springframework.boot            spring-boot-starter-data-r2dbc        org.springframework.boot            spring-boot-starter-data-jdbc        org.springframework.boot            spring-boot-starter-webflux        

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

3. R2DBC配置

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

@BeanConnectionFactory 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 */@Datapublic 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 clientUserFlux() {        return databaseClient.execute("select * from client_user").as(ClientUser.class)                .fetch()                .all();    }    /**     * 响应式写入.     *     * @return Mono对象包含更新成功的条数     */    @GetMapping("/add")    public Mono 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并没有想象中的那么难,但是间接的需要了解Flux、Mono等抽象概念。同时目前来说如果不和Webflux框架配合也没有使用场景。就本文的MySQL而言,R2DBC驱动还是社区维护(不得不说PgSQL就做的很好)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值