文章目录

  • 简介
  • 依赖关系
  • 数据库连接配置
  • 数据库初始化
  • DAO操作
  • Service操作和Transaction
  • controller
  • 测试

简介

上篇文章我们讲到了怎么在Spring webFlux中使用r2dbc,今天我们看一下怎么使用spring-data-r2dbc这个Spring data对r2dbc的封装来进行r2dbc操作。

依赖关系

要使用Spring-datea-r2dbc需要配置下面的依赖关系:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-r2dbc</artifactId><version>2.3.3.RELEASE</version></dependency><!-- R2DBC H2 Driver --><dependency><groupId>io.r2dbc</groupId><artifactId>r2dbc-h2</artifactId><version>${r2dbc-h2.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>

数据库连接配置

Spring-data-r2dbc使用的是R2dbcProperties来进行配置文件的读取:

简单看一下R2dbcProperties的定义:

@ConfigurationProperties(prefix = "spring.r2dbc")
public class R2dbcProperties {/*** Database name. Set if no name is specified in the url. Default to "testdb" when* using an embedded database.*/private String name;/*** Whether to generate a random database name. Ignore any configured name when* enabled.*/private boolean generateUniqueName;/*** R2DBC URL of the database. database name, username, password and pooling options* specified in the url take precedence over individual options.*/private String url;/*** Login username of the database. Set if no username is specified in the url.*/private String username;/*** Login password of the database. Set if no password is specified in the url.*/private String password;

相应的,看一下我们的配置文件是怎么样的:

spring.r2dbc.url=r2dbc:h2:mem://./testdb
spring.r2dbc.username=sa
spring.r2dbc.password=password

这里,我们使用的是H2数据库。

数据库初始化

数据库初始化过程中,我们需要创建一个users表格,这里我们在一个initDatabase bean中实现:

    @Beanpublic ApplicationRunner initDatabase(DatabaseClient client, UsersDao usersDao) {List<String> statements = Arrays.asList("DROP TABLE IF EXISTS USERS;","CREATE TABLE IF NOT EXISTS USERS ( 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(usersDao::save).subscribe(user -> log.info("User saved: {}", user));}private Flux<Users> getUser() {return Flux.just(new Users(null, "John", "Doe"), new Users(null, "Jane", "Doe"));}private Mono<Integer> executeSql(DatabaseClient client, String sql) {return client.execute(sql).fetch().rowsUpdated();}

上面的例子中,我们创建数据库分为了两部分,第一部分是数据库schema的操作,我们执行了drop和create table的操作。

第二部分是向数据库表中插入数据。

注意,上面的两部分操作都需要执行subscribe操作,以触发真正的Reactive操作。

DAO操作

在DAO操作之前,我们需要创建Users entity:

@Data
@AllArgsConstructor
public class Users {@Idprivate Integer id;private String firstname;private String lastname;boolean hasId() {return id != null;}
}

再看一下我们创建的UserDao:

public interface UsersDao extends ReactiveCrudRepository<Users, Long> {@Query("select id, firstname, lastname from users c where c.lastname = :lastname")Flux<Users> findByLastname(String lastname);
}

注意,这里并不需要添加@Component注解,因为我们继承了ReactiveCrudRepository,会自动帮我们创建UsersDao的实例,我们直接使用就可以了。

ReactiveCrudRepository为我们封装了一些DAO的基本操作,比如save,saveAll, findById ,existsById等基础操作。

当然,我们也可以自定义自己的SQL语句,比如上面的findByLastname。

Service操作和Transaction

我们看一下怎么使用UserDao来进行具体的方法操作:

@Component
public class UsersService {@Resourceprivate UsersDao usersDao;@Transactionalpublic Mono<Users> save(Users user) {return usersDao.save(user).map(it -> {if (it.getFirstname().equals("flydean")) {throw new IllegalStateException();} else {return it;}});}}

上面我们创建了一个save方法,用来保存相应的User对象。

controller

最后,我们创建一个controller来对外暴露相应的方法:

@RestController
@RequiredArgsConstructor
public class UsersController {private final UsersDao usersDao;@GetMapping("/users")public Flux<Users> findAll() {return usersDao.findAll();}
}

测试

好了,现在我们的程序已经写好了,可以进行测试了。

运行程序,执行:

curl "localhost:8080/users"
[{"id":1,"firstname":"John","lastname":"Doe"},{"id":2,"firstname":"Jane","lastname":"Doe"}]%

可以看到取出了相应的结果。

完美,实验成功。

本文的代码:spring-data-r2dbc

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/spring-data-r2dbc/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

在Spring data中使用r2dbc相关推荐

  1. 一步步学习 Spring Data 系列之JPA(一)

    2019独角兽企业重金招聘Python工程师标准>>> 大概有半年多没有写博客了,主要是最近忙于工作,也没来得及与大家分享技术.当然现在的技术大多都有人写其博客分享了,也找不到合适写 ...

  2. Spring.NET 中的 ADO.NET 数据访问的示例

    Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...

  3. spring boot spring data 整合 redis redis keys * 出现 \xac\xed\x00\x05t\x00) 编码异常

    spring boot 集成使用spring data时key出现 \xac\xed\x00\x05t\x00) 背景 最近在研究redis,在跑eladmin这个项目的时候,发现存储验证码的时候,把 ...

  4. 干货|一文读懂 Spring Data Jpa!

    有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...

  5. Spring Data Commons主要梳理

    这篇文章是在看Spring Data Commons文档的时候梳理的内容,都是与Spring Data相关的,里面可能会涉及到Spring Data JPA的内容,但更多的是Commons的内容,Sp ...

  6. r2dbc_使用Spring Data R2DBC进行异步RDBMS访问

    r2dbc 不久之前,发布了JDBC驱动程序的React性变体. 称为R2DBC. 它允许将数据异步流传输到已预订的任何端点. 通过将R2DBC之类的React性驱动程序与Spring WebFlux ...

  7. 使用Spring Data R2DBC进行异步RDBMS访问

    不久之前,发布了JDBC驱动程序的反应型. 称为R2DBC. 它允许将数据异步流传输到已预订的任何端点. 通过将R2DBC之类的反应性驱动程序与Spring WebFlux结合使用,可以编写一个完整的 ...

  8. Spring系列学习之Spring Data R2DBC数据访问

    英文原文:https://spring.io/projects/spring-data-r2dbc 目录 概述 快速开始 学习 文档 示例 概述 Spring Data R2DBC是更大的Spring ...

  9. Spring Boot中Spring data注解的使用

    文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...

最新文章

  1. Realm 使用的简单教程
  2. HDU4825 Xor Sum —— Trie树
  3. 数据分析系列:绘制折线图(matplotlib)2
  4. C语言中低位存放,C语言 大端小端存储解析以及判断方法
  5. Centos 配置多个虚拟IP
  6. 一步一步SharePoint 2007之五:向网站中添加一个子网站
  7. 数据结构——哈弗曼编码问题
  8. 动态规划——最嘉观光组合(Leetcode 1014)
  9. git分支开发常用命令
  10. 凸优化第六章逼近与拟合 6.2最小范数问题
  11. Drools 规则引擎的使用
  12. dubbo源码解析-zookeeper连接
  13. 计算机的储存容量1kb等于多少byte,1kb等于多少mb
  14. Backlog Order
  15. 亚马逊云科技软件开发工程师团队
  16. 技术人员硬实力和软实力
  17. 六天八小时能否主张加班费?
  18. 【Day 3】机器阅读理解——常见机器阅读理解模型(下)
  19. 大数据的五大关键技术
  20. jwt单点登录 和防重放攻击

热门文章

  1. Xmanager远程桌面教程
  2. Keras-常用代码
  3. 天锋w2019_不知道为什么那么多人喜欢三星W2019,直到入手这款天锋W2019手机
  4. 容器中构建镜像慢,在dockerfile中换源加速
  5. HDU3388(二分+容斥原理)
  6. HDU4082(相似三角形的个数)
  7. Python_文件_日记管理系统
  8. Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理
  9. 数据结构与算法 | 队列
  10. 第50讲:Scrapy 部署不用愁,Scrapyd 的原理和使用