Spring Data R2DBC 入门

Stella981
• 阅读 768

1、介绍

R2DBC(Reactive Relational Database Connectivity)是在2018年Spring One Platform大会被提出来的,它旨在使用完全无阻塞驱动程序创建数据库链接,为SQL数据库创建响应式API。为了探索R2DBC我们将创建一个简单的WebFlux应用实现目标

2、项目配置

我们通过Spring Initializr创建一个新的项目,如下图所示选择我们需要的依赖。确保Spring Boot的版本大于等于2.3.0。因为在此版本之后才开始支持MYSQL的响应式驱动

Spring Data R2DBC 入门

Spring Data R2DBC 入门

Maven依赖如下:``

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-r2dbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
        </dependency>

        <dependency>
            <groupId>dev.miku</groupId>
            <artifactId>r2dbc-mysql</artifactId>
            <scope>runtime</scope>
        </dependency>

3、脚本准备

create table test.users
(
    id         bigint auto_increment,
    first_name varchar(50) null,
    last_name  varchar(50) null,
    created_at datetime    null,
    updated_at datetime    null,
    constraint users_id_uindex
        unique (id)
);

alter table test.users
    add primary key (id);

4、应用代码

4.1 实体对象

注意这里用的日期类型是java.time.LocalDateTime,默认不能使用java.sql.Date、java.util.Date、java.sql.Timestamp类型,否则会提示错误。默认支持的类型转换参考org.springframework.data.r2dbc.convert.R2dbcConverters类。

@Table(value = "users")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class User {

    @Id
    private Long id;

    @Column(value = "first_name")
    private String firstName;

    @Column(value = "last_name")
    private String lastName;

    @Column(value = "created_at")
    private LocalDateTime createdAt;

    @Column(value = "updated_at")
    private LocalDateTime updatedAt;

}

4.2 控制层代码

/**
 * 支持增加、修改、删除、查询
 * @date 2020-05-24
 * @author 稻草鸟人
 */
@RestController
@RequestMapping("/v1")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping(path = "/users/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(code = HttpStatus.OK)
    public Mono<User> getUser(@PathVariable("id") Long id) {
        Mono<User> userMono = userService.find(id);
        return userMono;
    }

    @PutMapping("/users/{id}")
    public Mono<User> update(@PathVariable("id") Long id, @RequestBody User user) {
        return this.userService.find(id)
                .map(u -> {
                    u.setFirstName(user.getFirstName());
                    u.setLastName(user.getLastName());
                    return u;
                })
                .flatMap(u -> save(u));
    }

    @DeleteMapping("/users/{id}")
    public Mono<Void> delete(@PathVariable("id") Long id) {
        return userService.delete(id);
    }


    @PostMapping("/users")
    public Mono<User> save(@RequestBody User user) {
        return userService.save(user);
    }

其他代码不再贴了,具体参考下面的源码部分

5、简单测试

Spring Data R2DBC 入门

目前只是简单的测试,后面我们做一次简单的压测,比较下非阻塞接口和同步接口的性能差异吧!

6、源码

https://github.com/cattles/fucking-great-r2dbc

Spring Data R2DBC 入门

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
JdbcTemplate 和 mybatis 的对比
好处:  1.jdbcTemplate是spring对jdbc操作数据库进行的封装,使得开发者可以直接在java文件中编写sql,无需配置xml文件。  2.简单效率快缺点:  1. 使用时创建连接,不使用时立即释放。频繁的连接开启和关闭造成资源的浪费,影响数据库的性能。     解决办法:使用数据库连接池,
Stella981 Stella981
3年前
Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
Spring5.0中发布了重量级组件Webflux,拉起了响应式编程的规模使用序幕。WebFlux使用的场景是异步非阻塞的,使用Webflux作为系统解决方案,在大多数场景下可以提高系统吞吐量。SpringBoot2.0是基于Spring5构建而成,因此SpringBoot2.X将自动继承了Webflux组件,本篇给大家
Stella981 Stella981
3年前
Spring Boot 整合 JdbcTemplate 多数据源
学习在SpringBoot中使用JdbcTemplate多数据源来操作不同的数据库。JdbcTemplate是Spring自带的,虽然功能没有MyBatis强大,但使用简单。1创建工程并配置新建SpringBoot项目springbootjdbctemplatemulti,添加Web/J
Wesley13 Wesley13
3年前
MongoDB学习(1)
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。数据库一个mongodb中可以建立多个数据库,MongoDB中默认数据库为"db",该数据库存储在data目录中。在MongoDB中可以创建数据库,如果你想使用MongoDB,创建数据库不是必要的。"showd
Wesley13 Wesley13
3年前
Java SQL基础
SQL基础1、DataBase创建:CREATEDATABASEDATABASE\_NAME ;使用:USEDATABASE\_NAME;删除:DROPDATABASEDATABASE\_NAME;2、Table创建CREATET
Wesley13 Wesley13
3年前
IOC的使用
1.概要:在spring中,都是使用反射机制创建对象,将创建对象的权利交给spring容器,就是控制反转(ioc)对象创建方式有参构造无参构造工厂模式(静态,非静态)2.创建IDEA控制台测试项目!(https://oscimg.oschina.net/oscnet/a77ea6a2907139751d63
Easter79 Easter79
3年前
Spring入门(一):创建Spring项目
本篇博客作为Spring入门系列的第一篇博客,不会讲解什么是Spring以及Spring的发展史这些太理论的东西,主要讲解下如何使用IntelliJIDEA创建Spring项目以及通过一个示例了解下Spring的简单使用。1\.创建Spring项目首先,按照下图所示打开“新建项目”弹出框:!(https://
Wesley13 Wesley13
3年前
CAT安装使用
cat安装使用需要准备的文件及内容分别为:1.OSLinuxorWiondow2.数据库mysql3.应用服务器tomcat端口号配置为:99964.准备操作系统配有占用的端口22801.创建目录前提:需要创建/data/appdatas/cat、/data/applog
Stella981 Stella981
3年前
Apache Zeppelin连接Oracle数据库
   本文介绍ApacheZeppelin网页笔记本如何创建配置jdbc解释器,连接Oracle数据库,进行SQL开发,实现数据可视化。  简单来说,步骤如下:1.下载ojdbc8.jar2.创建新jdbc解释器3.配置jdbc参数4.测试新解释器1. Downloadojdbc8.jar2.Creat