博客
关于我
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 R2DBC 与 Spring 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 堆排序
查看>>
python编程方式之一-函数式编程
查看>>
python 复习计划
查看>>
Python 多处理 apply_async 永远不会在 Windows 7 上返回结果
查看>>
Python 多处理 Numpy 随机
查看>>
Python 多处理 >= 125 列表永远不会完成
查看>>
Python 多处理:在第一个子错误时中止映射
查看>>
Python 多处理不断产生 pythonw.exe 进程而不做任何实际工作
查看>>
Python 多处理从不加入
查看>>
Python 多处理如何优雅地退出?
查看>>
Python 多处理将子进程的标准输出重定向到 Tkinter 文本
查看>>
Python 多处理库错误(AttributeError:__exit__)
查看>>
Python 多处理模块的 .join() 方法到底在做什么?
查看>>
python 多线程与GIL
查看>>
python 多进程-基础
查看>>
python 多进程-进阶-进程池
查看>>
python 多进程-进阶-进程间通信之Pipe
查看>>
python 多进程-进阶-进程间通信之Queue
查看>>
python 如何“否定“value : 如果为真则返回假,如果为假则返回真
查看>>