博客
关于我
Spring Data R2DBC响应式操作MySQL
阅读量:424 次
发布时间:2019-03-06

本文共 3206 字,大约阅读时间需要 10 分钟。

Spring Data R2DBC 实践指南

前言

在之前的文章中,我初步介绍了使用 r2dbc-mysql 的经验。然而,直接通过 DatabaseClient 操作 MySQL 可能过于底层,不利于开发。今天,我将结合 Spring Data R2DBC,演示其与 Spring Data Repository 风格的数据库操作特性。

注意事项:目前 Spring Data R2DBC 尽管已经迭代了多个正式版本,但仍处于初级阶段,尚不足以用于生产环境。然而,未来值得关注和研究。

Spring Data R2DBC 简介

Spring Data R2DBC 提供了基于反应式关系数据库驱动程序的 Repository 抽象。它并非传统的 ORM框架,不提供缓存、懒加载等特性,但其抽象了数据库与对象的映射关系,具有轻量级和易用性的特点。它可以视为 R2DBC 的客户端程序,用于抽象数据库操作。

版本对应关系

以下是 Spring Data R2DBCSpring Framework 的版本对应关系:

Spring Data R2DBC Spring Framework
1.0.0.RELEASE 5.2.2.RELEASE
1.1.0.RELEASE 5.2.6.RELEASE
1.1.1.RELEASE 5.2.7.RELEASE
1.1.2.RELEASE 5.2.8.RELEASE

确保版本兼容性,避免不兼容问题。

依赖管理

本项目依赖以下库:

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

本项目使用 Spring Boot 2.3.2.RELEASE

数据库配置

采用 application.yaml 配置 R2DBC 参数:

spring:    r2dbc:        url: r2dbcs:mysql://127.0.0.1:3306/r2dbc        username: root        password: 123456

spring.r2dbc.url 格式需根据数据库驱动调整,连接池使用默认配置即可。

业务逻辑编写

数据库实体声明

定义数据库实体类:

@Data@Tablepublic class ClientUser implements Serializable {    private static final long serialVersionUID = -558043294043707772L;    @Id    private String userId;    private String nickName;    private String phoneNumber;    private Integer gender;}

CRUD 接口声明

定义 CRUD 接口:

public interface ReactiveClientUserSortingRepository extends ReactiveSortingRepository
{}

数据库操作

尝试使用 DatabaseClient 执行 DDL 语句创建表:

@AutowiredDatabaseClient databaseClient;@Testvoid doDDL() {    List
ddl = Collections.unmodifiableList( Arrays.asList( "drop table if exists client_user;", "create table client_user (" + "user_id varchar(64) not null primary key," + "nick_name varchar(32)," + "phone_number varchar(16)," + "gender tinyint default 0" + ") charset = utf8mb4;" ) ); Mono
operation = databaseClient .execute(ddl) .fetch() .rowsUpdated() .as(StepVerifier::create) .expectNextCount(1) .verifyComplete();}

新数据插入

由于 R2DBC 无法直接使用传统的插入方式,我们使用自定义查询:

@Modifying@Query("insert into client_user (" +    "user_id,nick_name,phone_number,gender" +    ") values (:userId,:nickName,:phoneNumber,:gender)")Mono
addClientUser( String userId, String nickName, String phoneNumber, Integer gender);

Webflux 集成

创建 Webflux 接口:

@RestControllerMapping("/user")public class ReactiveClientUserController {    @Autowired    private ReactiveClientUserSortingRepository reactiveClientUserSortingRepository;    @GetMapping("/{userId}")    public Mono
findUserById(@PathVariable String userId) { return reactiveClientUserSortingRepository.findById(userId); }}

测试数据参考

在低并发环境下,Spring MVC + JDBC 最为稳定。然而,在高并发场景下,WebFlux + R2DBC 提供了更优的性能表现。

总结

今天对 Spring Data R2DBC 进行了深入演示。尽管其仍处于初级阶段,但社区活跃,未来发展潜力巨大。希望本文能为您带来帮助。

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

转载地址:http://eajuz.baihongyu.com/

你可能感兴趣的文章
python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
查看>>
Python十进制&;包提供错误的结果
查看>>
Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
查看>>
Python加速运行技巧
查看>>
python办公自动化基础遍历文件夹
查看>>
python办公自动化基础输出文件和文件夹
查看>>
python办公自动化基础搜索文件
查看>>
python知识:@classmethod和@staticmethod的异同
查看>>
python前端之css
查看>>
Python制作进度条,原来有这么多方法
查看>>
Python制作简单的学生成绩管理系统
查看>>
python制作甘特图的基本知识(附Demo)
查看>>
python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
查看>>
Python到底能做什么?它的优点在哪?
查看>>
python利用pytorch库导出图像分割算子
查看>>
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>