一、R2DBC是什么?

反应式编程能大大降低服务器的内存和线程需要量。但是并非所有数据库都能原生支持反应式编程。通常只有非关系型数据库支持反应式编程。为了使关系型数据库支持反应式编程,发明了R2DBC。

二、如何使用R2DBC

1. 使用Maven引入的依赖项

部分pom.xml

...<dependencies><!-- Spring WebFlux依赖项 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- Spring Data JPA依赖项 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2嵌入式数据库依赖项 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- R2DBC依赖项,用于使不支持反应式的数据库支持反应式 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-r2dbc</artifactId></dependency><!-- R2DBC-h2依赖项,为了使R2DBC能使用H2数据库 --><dependency><groupId>io.r2dbc</groupId><artifactId>r2dbc-h2</artifactId><scope>runtime</scope></dependency><!-- lombok依赖项,用于自动生成代码 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>
...

2. 配置文件

application.yml

spring: r2dbc: # 设置R2DBC的url。这里使用的h2数据库。基于内存。创建的数据库名是testdburl: r2dbc:h2:mem://./testdbusername: sapassword: 123456

3. Java文件

Usr.java

package model;import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import lombok.AllArgsConstructor;
import lombok.Data;@Table
@Data
@AllArgsConstructor
public class Usr {@Idprivate Integer id;private String firstname;private String lastname;boolean hasId() {return id != null;}
}

UsrRepository.java

package repository;import org.springframework.data.r2dbc.repository.Query;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;
import model.Usr;public interface UsrRepository extends ReactiveCrudRepository<Usr, Integer> {@Query("SELECT id, firstname, lastname FROM Usr c WHERE c.lastname = :lastname")Flux<Usr> findByLastname(String lastname);
}

UsrController.java

package controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import model.Usr;
import repository.UsrRepository;@RestController
@RequestMapping(path = "/user", produces = "application/hal+json")
@RequiredArgsConstructor
public class UsrController {private final UsrRepository usrRepository;@GetMapping("/all")public Flux<Usr> findAll() {return usrRepository.findAll();}@GetMapping("/save")public Mono<Usr> save() {Usr user = new Usr(null, "Lindong", "Wang");return usrRepository.save(user);}
}

DatabaseConfig.java

package config;import java.util.Arrays;
import java.util.List;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.r2dbc.core.DatabaseClient;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import model.Usr;
import repository.UsrRepository;@Configuration
@Slf4j
public class DbConfig {@Beanpublic ApplicationRunner initDatabase(DatabaseClient client, UsrRepository usrRepository) {List<String> statements = Arrays.asList("DROP TABLE IF EXISTS Usr;", "CREATE TABLE IF NOT EXISTS Usr (id SERIAL PRIMARY KEY, firstname VARCHAR(100) NOT NULL, lastname VARCHAR(100) NOT NULL);");statements.forEach(sql -> executeSql(client, sql).doOnSuccess(count -> log.info("Schema created, rows updated: {}", count)).doOnError(error -> log.error("got error: {}", error.getMessage(), error)).subscribe());return args -> getUser().flatMap(usrRepository::save).subscribe(user -> log.info("User saved: {}", user));}private Flux<Usr> getUser() {return Flux.just(new Usr(null, "John", "Doe"), new Usr(null, "Jane", "Doe"));}private Mono<Integer> executeSql(DatabaseClient client, String sql) {return client.sql(sql).fetch().rowsUpdated();}
}

4. 测试代码

在控制台输入:curl localhost:8080/user/all
可以获得返回结果:[{“id”:1,“firstname”:“John”,“lastname”:“Doe”},{“id”:2,“firstname”:“Jane”,“lastname”:“Doe”}]

如何使用R2DBC连接数据库?相关推荐

  1. 【VB】学生信息管理系统3——连接数据库的前提

    在窗体设计和编写程序代码后,需要进行数据库的连接. 大概要做的:下载安装数据库--配置数据源ODBC--测试连接数据库--进行数据库中内容的添加. 关键是这些我都不会,这才是重点! 在学习数据库的过程 ...

  2. 网页如何与mysql服务器建立连接不上,html与mysql建立连接数据库

    html与mysql建立连接数据库 内容精选 换一换 云数据库 GaussDB(for MySQL)是华为云提供的一款安全.可信的数据库服务.GaussDB(for MySQL)秉承华为云对租户的安全 ...

  3. db2删除大量数据_Python 连接数据库的多种方法

    Python是一种计算机程序设计语言,它是一种动态的.面向对象的脚本语言.它是一种跨平台的,可以运行在 Windows,Mac和 Linux/Unix系统上. 在日常使用中需要对大量数据进行数据分析, ...

  4. Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”

    Navicat连接数据库成功,新建查询时提示错误"Cannot create file --" 原因:编辑连接{高级}<设置位置>被修改,该oci.dll不正确 解决方 ...

  5. php使用pdo操作mysql数据库实例_php5使用pdo连接数据库实例

    本文为大家介绍下php pdo的用法. 一,pdo简介 pdo(php data object) 是php 5 中加入的东西,是php 5新加入的一个重大功能,因为在php 5以前的php4/php3 ...

  6. JDBC编程:1(使用JDBC连接数据库)

    使用JDBC连接数据库 下载连接MySQL数据库的驱动 这个jar包可以在官网上对照着你的MySQL版本来下载,这里我下载的是最新的8.0.20版本, 这里是8.0.20版本的驱动包:mysql-co ...

  7. 如何使用jdbc连接数据库

    如何使用jdbc连接数据库 数据库是一个有组织的数据集合.数据库管理系统以一种与数据库格式一致的方式,提供了存储和组织数据的机制.数据库管理系统允许在不考虑内部数据表示的情况下访问和存储数据. jav ...

  8. 用户管理系统控制台版连接数据库

    建User表 CREATE TABLE `user` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) DEFAULT NULL,`pw ...

  9. 使用Properties连接数据库

    使用Properties连接数据库 要注意的是: 1.通过配置文件来连接数据库时,连接信息要以 mysql.XXX开头,否则会提示异常. java.sql.SQLException: Access d ...

  10. Java连接数据库 JDBC

    1.JDBC是什么? JDBC,英文全称:Java DataBase Connectivity,中文全称:java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访 ...

最新文章

  1. 一文了解可视化的主成分分析(附教程)
  2. 计算机网络谢希仁第七版课后答案第二章 物理层
  3. ffpemg扩展 安装php_ThinkSwoole 教程(二)安装
  4. android gpio驱动实例,Android/Linux 驱动层对GPIO口的操作方法和相关代码
  5. echarts雷达图线的样式_echarts 雷达图的个性化设置
  6. 融入产业生态的靶向孵化
  7. centos下利用httpd搭建http服务器方法
  8. 支付宝研究员兼OceanBase总架构师杨传辉:我在数据库梦之队的十年成长路
  9. 搭建Magento电子商务网站
  10. 一台机器上同时部署多个tomcat服务
  11. C++ 内存的分配方式
  12. Oracle书籍资料链接——更新ing
  13. 接口怎么获取数组底下的数组_3分钟短文 | PHP数组获取最后一个元素,10个方式中哪个有错?...
  14. 316 Remove Duplicate Letters 去除重复字母
  15. 使用mat工具分析对比dump文件
  16. pxe无盘服务器教程,Windows下架设PXE服务器的方法
  17. D511 外置功放软件烧录方法
  18. 微软背叛wintel联盟,Intel似乎正陷入四面楚歌之中
  19. linux samba 漏洞 exp,smaba漏洞总结
  20. 分布式 | dble 读写分离场景下为什么普通的读 sql 发送到了 master 实例上

热门文章

  1. WAV音频文件格式介绍
  2. 计算机网络笔记(王道考研) 第一章:计算机网络体系结构
  3. stm32cubeIDE下载无法打开GDB的问题
  4. MyEclipse创建Java项目
  5. 计算机软件著作权许可协议范本,软件著作权使用许可合同协议范本模板.doc
  6. python人脸识别库_用python库face_recognition进行人脸识别
  7. ftell函数的用法(用于获取指针位置)
  8. 端口和波特率测试软件,端口和波特率检测工具
  9. sql中获取当前时间
  10. 毕业季-Java分布式开发面试题