用 WebFlux 寫個 CURD 是什么體驗?
WebFlux 最為人所詬病的是數(shù)據(jù)庫的支持問題,畢竟數(shù)據(jù)是一個應(yīng)用的生命,我們接觸的大部分應(yīng)用程序都是有數(shù)據(jù)庫的,而 WebFlux 在這一方面的支持行一直比較弱,這也是大家總是吐槽它的原因。
不過從 Spring5 開始,這一問題得到了一定程度的緩解。
Spring 官方在 Spring5 發(fā)布了響應(yīng)式 Web 框架 Spring WebFlux 之后急需能夠滿足異步響應(yīng)的數(shù)據(jù)庫交互 API,不過由于缺乏標準和驅(qū)動,Pivotal 團隊開始自己研究響應(yīng)式關(guān)系型數(shù)據(jù)庫連接 Reactive Relational Database Connectivity,并提出了 R2DBC 規(guī)范 API 用來評估可行性并討論數(shù)據(jù)庫廠商是否有興趣支持響應(yīng)式的異步非阻塞驅(qū)動程序。最早只有 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 Boot 視頻教程中,松哥對 MongoDB 也有過介紹,感興趣的小伙伴戳這里:Spring Boot+Vue+微人事視頻教程。
配置完 MongoDB 后,我們的準備工作就算完成了。
2.實體類與 Dao
接下來我們需要準備一個操作的實體類,這些都是 JPA 的基本操作,松哥就不再贅述,如果小伙伴們不熟悉的話,可以公號后臺回復 666 查看原創(chuàng)的 Spring Boot 教程,里邊有涉及到,實體類如下:
接下來我們再提供一個實體類操作的接口,如下:
自定義一個空的接口繼承自 ReactiveMongoRepository,里邊什么都不用寫,這套路就和松哥之前視頻中介紹的 JPA 的用法如出一轍(畢竟都是 Spring Data 家族),所以這塊就沒啥好說的,不贅述。
3.測試接口
接下來我們來看看測試接口。
3.1 添加
首先我們來看看添加數(shù)據(jù)。
添加完成后,返回剛剛添加成功的對象。save 方法的返回值就是 Mono。
我們來看看測試效果:

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


可以看到兩種不同的查詢方式返回的數(shù)據(jù)格式也有差異。前者是以數(shù)組形式一次性返回數(shù)據(jù),后者是以 SSE 的形式多次返回數(shù)據(jù)。
3.3 刪除
再來看看刪除。
按照 RESTful 規(guī)范,如果刪除成功請求響應(yīng)碼就是 200,如果刪除失敗請求響應(yīng)碼就是 404,因此,我們開發(fā)出來的接口如下:
首先從數(shù)據(jù)庫中查詢出相關(guān)的數(shù)據(jù),然后調(diào)用 flatMap,在 flatMap 中對數(shù)據(jù)進行刪除處理,刪除完成后,給出一個 200 的響應(yīng)碼,如果查詢的時候沒有查詢到數(shù)據(jù),就給一個 404 響應(yīng)碼。
可以看到,刪除成功后,響應(yīng)碼為 200:

刪除失敗后,響應(yīng)碼為 404:

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

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

3.5 自定義查詢方法
松哥之前的 Spring Data Jpa 中講的一些查詢 API,這里同樣是適用的(公號后臺回復 666 獲取之前的教程)。
例如我們可以在 UserDao 中自定義一個查詢方法:
然后添加一個接口調(diào)用該方法:
這樣該接口就可以查詢名字中包含某關(guān)鍵字的所有用戶了。
其他關(guān)于 JPA 的用法這里都是適用的,因為在之前的文章中講過,松哥這里就不再贅述了。
4.小結(jié)
好啦,今天我們就用 WebFlux 寫了一個簡單的 CURD,大家先來感受下 WebFlux 的基本用法,后面的文章松哥將和大家分享 WebFlux 如何連接關(guān)系型數(shù)據(jù)庫,敬請期待。





























