在Spring data中使用r2dbc
文章目录
- 简介
- 依赖关系
- 数据库连接配置
- 数据库初始化
- 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相关推荐
- 一步步学习 Spring Data 系列之JPA(一)
2019独角兽企业重金招聘Python工程师标准>>> 大概有半年多没有写博客了,主要是最近忙于工作,也没来得及与大家分享技术.当然现在的技术大多都有人写其博客分享了,也找不到合适写 ...
- Spring.NET 中的 ADO.NET 数据访问的示例
Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...
- spring boot spring data 整合 redis redis keys * 出现 \xac\xed\x00\x05t\x00) 编码异常
spring boot 集成使用spring data时key出现 \xac\xed\x00\x05t\x00) 背景 最近在研究redis,在跑eladmin这个项目的时候,发现存储验证码的时候,把 ...
- 干货|一文读懂 Spring Data Jpa!
有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...
- Spring Data Commons主要梳理
这篇文章是在看Spring Data Commons文档的时候梳理的内容,都是与Spring Data相关的,里面可能会涉及到Spring Data JPA的内容,但更多的是Commons的内容,Sp ...
- r2dbc_使用Spring Data R2DBC进行异步RDBMS访问
r2dbc 不久之前,发布了JDBC驱动程序的React性变体. 称为R2DBC. 它允许将数据异步流传输到已预订的任何端点. 通过将R2DBC之类的React性驱动程序与Spring WebFlux ...
- 使用Spring Data R2DBC进行异步RDBMS访问
不久之前,发布了JDBC驱动程序的反应型. 称为R2DBC. 它允许将数据异步流传输到已预订的任何端点. 通过将R2DBC之类的反应性驱动程序与Spring WebFlux结合使用,可以编写一个完整的 ...
- Spring系列学习之Spring Data R2DBC数据访问
英文原文:https://spring.io/projects/spring-data-r2dbc 目录 概述 快速开始 学习 文档 示例 概述 Spring Data R2DBC是更大的Spring ...
- Spring Boot中Spring data注解的使用
文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...
最新文章
- Realm 使用的简单教程
- HDU4825 Xor Sum —— Trie树
- 数据分析系列:绘制折线图(matplotlib)2
- C语言中低位存放,C语言 大端小端存储解析以及判断方法
- Centos 配置多个虚拟IP
- 一步一步SharePoint 2007之五:向网站中添加一个子网站
- 数据结构——哈弗曼编码问题
- 动态规划——最嘉观光组合(Leetcode 1014)
- git分支开发常用命令
- 凸优化第六章逼近与拟合 6.2最小范数问题
- Drools 规则引擎的使用
- dubbo源码解析-zookeeper连接
- 计算机的储存容量1kb等于多少byte,1kb等于多少mb
- Backlog Order
- 亚马逊云科技软件开发工程师团队
- 技术人员硬实力和软实力
- 六天八小时能否主张加班费?
- 【Day 3】机器阅读理解——常见机器阅读理解模型(下)
- 大数据的五大关键技术
- jwt单点登录 和防重放攻击