成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 WebFlux 寫個 CURD 是什么體驗?

開發(fā) 架構
Spring 官方在 Spring5 發(fā)布了響應式 Web 框架 Spring WebFlux 之后急需能夠滿足異步響應的數(shù)據(jù)庫交互 API,不過由于缺乏標準和驅動,Pivotal 團隊開始自己研究響應式關系型數(shù)據(jù)庫連接 Reactive Relational Database Connectivity,并提出了 R2DBC 規(guī)范 API 用來評估可行性并討論數(shù)據(jù)庫廠商是否有興趣支持響應式的異步非

WebFlux 最為人所詬病的是數(shù)據(jù)庫的支持問題,畢竟數(shù)據(jù)是一個應用的生命,我們接觸的大部分應用程序都是有數(shù)據(jù)庫的,而 WebFlux 在這一方面的支持行一直比較弱,這也是大家總是吐槽它的原因。

不過從 Spring5 開始,這一問題得到了一定程度的緩解。

Spring 官方在 Spring5 發(fā)布了響應式 Web 框架 Spring WebFlux 之后急需能夠滿足異步響應的數(shù)據(jù)庫交互 API,不過由于缺乏標準和驅動,Pivotal 團隊開始自己研究響應式關系型數(shù)據(jù)庫連接 Reactive Relational Database Connectivity,并提出了 R2DBC 規(guī)范 API 用來評估可行性并討論數(shù)據(jù)庫廠商是否有興趣支持響應式的異步非阻塞驅動程序。最早只有 PostgreSQL 、H2、MSSQL 三家數(shù)據(jù)庫廠商,不過現(xiàn)在 MySQL 也加入進來了,這是一個極大的利好。目前 R2DBC 的最新版本是 0.9.0.RELEASE。

松哥在接下來的文章中將會和大家演示 R2DBC 的用法,但是今天我們還是先來看看 WebFlux+MongoDB 的用法,畢竟這是 WebFlux 較早支持的數(shù)據(jù)庫之一,各種 API 都比較成熟,我們一步一步來。

1.項目創(chuàng)建

方便起見,我們這里就直接創(chuàng)建 Spring Boot 項目,首先創(chuàng)建一個 Spring Boot 項目,引入 MongoDB 依賴和 WebFlux 依賴,如下:

圖片

注意我們這里選擇的 MongoDB 依賴是 Spring Data Reactive MongoDB,千萬別選錯了。

項目創(chuàng)建完成后,我們先在 application.properties 中對 MongoDB 進行簡單配置,如下(如果小伙伴們尚不熟悉 MongoDB 的操作,可以在公眾號底部菜單找到松哥原創(chuàng)的 MongoDB 教程):

spring.data.mongodb.port=27017
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.username=madmin
spring.data.mongodb.password=m123
spring.data.mongodb.database=test
spring.data.mongodb.authentication-database=admin

多說一句,在之前的 Spring Boot 視頻教程中,松哥對 MongoDB 也有過介紹,感興趣的小伙伴戳這里:Spring Boot+Vue+微人事視頻教程。

配置完 MongoDB 后,我們的準備工作就算完成了。

2.實體類與 Dao

接下來我們需要準備一個操作的實體類,這些都是 JPA 的基本操作,松哥就不再贅述,如果小伙伴們不熟悉的話,可以公號后臺回復 666 查看原創(chuàng)的 Spring Boot 教程,里邊有涉及到,實體類如下:

@Document
public class User {
@Id
private String id;
private String username;
private String address;

public String getId(){
return id;
}

public void setId(String id){
this.id = id;
}

public String getUsername(){
return username;
}

public void setUsername(String username){
this.username = username;
}

public String getAddress(){
return address;
}

public void setAddress(String address){
this.address = address;
}
}

接下來我們再提供一個實體類操作的接口,如下:

@EnableMongoRepositories
public interface UserDao extends ReactiveMongoRepository<User,String> {
}

自定義一個空的接口繼承自 ReactiveMongoRepository,里邊什么都不用寫,這套路就和松哥之前視頻中介紹的 JPA 的用法如出一轍(畢竟都是 Spring Data 家族),所以這塊就沒啥好說的,不贅述。

3.測試接口

接下來我們來看看測試接口。

3.1 添加

首先我們來看看添加數(shù)據(jù)。

@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserDao userDao;

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

添加完成后,返回剛剛添加成功的對象。save 方法的返回值就是 Mono。

我們來看看測試效果:

圖片

3.2 查詢

再來看看查詢效果:

@GetMapping("/")
public Flux<User> getAll(){
return userDao.findAll();
}
@GetMapping(value = "/stream/all", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<User> streamGetAll(){
return userDao.findAll();
}

我們提供了兩個查詢接口,一個就是返回 Flux,里邊包含多個對象,還有一個我設置了響應的 Content-Type 為 text/event-stream,通過響應式流返回數(shù)據(jù),具體參見【服務端推送數(shù)據(jù),除了 WebSocket 你還能想到啥?】一文。

我們來看看查詢效果:

圖片

圖片

可以看到兩種不同的查詢方式返回的數(shù)據(jù)格式也有差異。前者是以數(shù)組形式一次性返回數(shù)據(jù),后者是以 SSE 的形式多次返回數(shù)據(jù)。

3.3 刪除

再來看看刪除。

按照 RESTful 規(guī)范,如果刪除成功請求響應碼就是 200,如果刪除失敗請求響應碼就是 404,因此,我們開發(fā)出來的接口如下:

@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteUser(@PathVariable String id) {
return userDao.findById(id)
.flatMap(user -> userDao.delete(user).then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK))))
.defaultIfEmpty(new ResponseEntity(HttpStatus.NOT_FOUND));
}

首先從數(shù)據(jù)庫中查詢出相關的數(shù)據(jù),然后調用 flatMap,在 flatMap 中對數(shù)據(jù)進行刪除處理,刪除完成后,給出一個 200 的響應碼,如果查詢的時候沒有查詢到數(shù)據(jù),就給一個 404 響應碼。

可以看到,刪除成功后,響應碼為 200:

圖片

刪除失敗后,響應碼為 404:

圖片

3.4 修改

再來看看修改,和前面的刪除類似,先查詢,再修改:

@PutMapping("/")
public Mono<ResponseEntity<User>> updateUser(@RequestBody User user) {
return userDao.findById(user.getId())
.flatMap(u -> userDao.save(user))
.map(u->new ResponseEntity<User>(u,HttpStatus.OK))
.defaultIfEmpty(new ResponseEntity(HttpStatus.NOT_FOUND));
}

圖片

如果修改的數(shù)據(jù)不存在的話,就會給出一個 404 響應:

圖片

3.5 自定義查詢方法

松哥之前的 Spring Data Jpa 中講的一些查詢 API,這里同樣是適用的(公號后臺回復 666 獲取之前的教程)。

例如我們可以在 UserDao 中自定義一個查詢方法:

@EnableMongoRepositories
public interface UserDao extends ReactiveMongoRepository<User,String> {
Flux<User> findUserByUsernameContaining(String name);
}

然后添加一個接口調用該方法:

@GetMapping("/byname")
public Flux<User> getUserByName(String name){
return userDao.findUserByUsernameContaining(name);
}

這樣該接口就可以查詢名字中包含某關鍵字的所有用戶了。

其他關于 JPA 的用法這里都是適用的,因為在之前的文章中講過,松哥這里就不再贅述了。

4.小結

好啦,今天我們就用 WebFlux 寫了一個簡單的 CURD,大家先來感受下 WebFlux 的基本用法,后面的文章松哥將和大家分享 WebFlux 如何連接關系型數(shù)據(jù)庫,敬請期待。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2023-10-31 08:21:18

WebFlux基本用法JPA

2022-11-06 19:01:24

CURD數(shù)據(jù)庫開發(fā)

2020-09-25 18:37:21

iOS 14蘋果組件

2021-09-13 16:40:30

Java C 語言游戲

2021-05-17 08:25:32

微軟工作環(huán)境

2022-11-07 17:46:50

亞馬遜云科技

2017-07-28 10:01:34

國產靜電容鍵盤

2020-08-10 07:44:13

虛擬內存交換內存Linux

2017-04-14 10:11:37

閃存備份用例

2015-07-23 09:20:19

mmap

2024-01-15 08:16:10

Maven插件簡化

2021-06-29 07:04:38

爬蟲代碼Python

2022-04-07 11:27:15

數(shù)字孿生VR系統(tǒng)AI

2018-02-05 15:09:03

2024-10-18 10:00:00

云計算虛擬

2021-07-13 09:08:19

磁盤陣列系統(tǒng)

2022-11-07 12:45:30

ripgrep命令Linux

2022-11-03 08:07:54

Python工具navicat

2012-03-07 15:24:41

2017-03-21 23:29:44

DevOps運維開發(fā)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品中文字幕在线观看 | 国产精品无码专区在线观看 | 久久久久久国产精品免费免费 | h视频在线播放 | 九九综合 | 亚洲三区视频 | 97成人免费 | 亚洲国产一区二区三区 | av影音| 国产成人精品一区二三区在线观看 | 亚洲视频中文字幕 | 免费看国产精品视频 | 亚洲国产一区在线 | 欧产日产国产精品视频 | 一本综合久久 | 日韩av在线一区 | 日韩快播电影 | 亚洲一区二区三区免费视频 | 国产在线二区 | 中文字幕日韩一区 | 99久久婷婷国产综合精品电影 | 最新中文字幕在线 | 午夜久草 | 97视频在线观看免费 | 黑人巨大精品 | 色综合一区二区三区 | 亚洲成人精选 | 精品国偷自产在线 | 精品欧美一区免费观看α√ | 亚洲国产精品久久久久婷婷老年 | 国产精品成人一区二区三区夜夜夜 | 一级欧美日韩 | 中文字幕第100页 | 91视频精选| 国产精品视频偷伦精品视频 | 亚洲九九色 | 国产丝袜人妖cd露出 | 国产精品视频500部 a久久 | 91久久精品日日躁夜夜躁国产 | 玖玖国产精品视频 | av黄色免费在线观看 |