自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用 WebFlux 寫個(gè) CURD 是什么體驗(yàn)?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
今天我們還是先來看看 WebFlux+MongoDB 的用法,畢竟這是 WebFlux 較早支持的數(shù)據(jù)庫之一,各種 API 都比較成熟,我們一步一步來。

今天我們繼續(xù)來搞 WebFlux!

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

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

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

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

1.項(xiàng)目創(chuàng)建

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

圖片圖片

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

項(xiàng)目創(chuàng)建完成后,我們先在 application.properties 中對(duì) MongoDB 進(jìn)行簡單配置,如下(如果小伙伴們尚不熟悉 MongoDB 的操作,可以在公眾號(hào)底部菜單找到松哥原創(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 視頻教程中,松哥對(duì) MongoDB 也有過介紹,感興趣的小伙伴戳這里:Spring Boot+Vue+微人事視頻教程。

配置完 MongoDB 后,我們的準(zhǔn)備工作就算完成了。

2.實(shí)體類與 Dao

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

@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;
    }
}

接下來我們?cè)偬峁┮粋€(gè)實(shí)體類操作的接口,如下:

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

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

3.測(cè)試接口

接下來我們來看看測(cè)試接口。

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);
    }
}

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

我們來看看測(cè)試效果:

圖片圖片

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();
}

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

我們來看看查詢效果:

圖片圖片

圖片圖片

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

3.3 刪除

再來看看刪除。

按照 RESTful 規(guī)范,如果刪除成功請(qǐng)求響應(yīng)碼就是 200,如果刪除失敗請(qǐng)求響應(yīng)碼就是 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ù)庫中查詢出相關(guān)的數(shù)據(jù),然后調(diào)用 flatMap,在 flatMap 中對(duì)數(shù)據(jù)進(jìn)行刪除處理,刪除完成后,給出一個(gè) 200 的響應(yīng)碼,如果查詢的時(shí)候沒有查詢到數(shù)據(jù),就給一個(gè) 404 響應(yīng)碼。

可以看到,刪除成功后,響應(yīng)碼為 200:

圖片圖片

刪除失敗后,響應(yīng)碼為 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ù)不存在的話,就會(huì)給出一個(gè) 404 響應(yīng):

圖片圖片

3.5 自定義查詢方法

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

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

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

然后添加一個(gè)接口調(diào)用該方法:

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

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

其他關(guān)于 JPA 的用法這里都是適用的,因?yàn)樵谥暗奈恼轮兄v過,松哥這里就不再贅述了。

4.小結(jié)

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

責(zé)任編輯:武曉燕 來源: 江南一點(diǎn)雨
相關(guān)推薦

2022-11-04 11:44:56

WebFluxCURDWeb

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 語言游戲

2022-11-07 17:46:50

亞馬遜云科技

2021-05-17 08:25:32

微軟工作環(huán)境

2024-01-15 08:16:10

Maven插件簡化

2017-07-28 10:01:34

國產(chǎn)靜電容鍵盤

2020-08-10 07:44:13

虛擬內(nèi)存交換內(nèi)存Linux

2015-07-23 09:20:19

mmap

2017-04-14 10:11:37

閃存備份用例

2021-06-29 07:04:38

爬蟲代碼Python

2022-04-07 11:27:15

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

2022-11-07 12:45:30

ripgrep命令Linux

2022-11-03 08:07:54

Python工具navicat

2012-03-07 15:24:41

2024-10-18 10:00:00

云計(jì)算虛擬

2021-07-13 09:08:19

磁盤陣列系統(tǒng)

2020-12-23 10:00:48

ReactServer CompView

2024-09-04 08:46:38

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)