這一篇文章介紹SpringBoot使用WebFlux響應(yīng)式編程操作MongoDb數(shù)據(jù)庫。
前言
在之前一篇簡單介紹了WebFlux響應(yīng)式編程的操作,我們在來看一下下圖,可以看到,在目前的Spring WebFlux還沒有支持類似Mysql這樣的關(guān)系型數(shù)據(jù)庫,所以本文以MongoDb數(shù)據(jù)庫為例。
SpringBoot使用WebFlux響應(yīng)式編程操作數(shù)據(jù)庫
接下來介紹SpringBoot使用WebFlux響應(yīng)式編程操作MongoDb數(shù)據(jù)庫。
新建項目
pom文件
新建項目,在項目中加入webflux依賴和mongodb-reactive依賴,完整pom代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalaoyang</groupId>
<artifactId>springboot_mongodb2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_mongodb2</name>
<description>springboot_mongodb2</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件
配置文件中配置mongodb數(shù)據(jù)庫信息,之前文章有介紹,這里就不介紹了,配置文件代碼如下:
##端口號
server.port=8888
##mongo配置
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
啟動類
啟動類是默認(rèn)生成的,沒有做任何修改,代碼如下:
package com.dalaoyang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootMongodb2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootMongodb2Application.class, args);
}
}
創(chuàng)建實(shí)體類
新建一個實(shí)體類UserInfo,代碼內(nèi)容沒有什么特殊的,這里就不做介紹了,實(shí)體類完整代碼如下:
package com.dalaoyang.entity;
import org.springframework.data.annotation.Id;
public class UserInfo {
@Id
private Long id;
private String username;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserInfo(Long id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public UserInfo() {
}
}
數(shù)據(jù)操作層
新建一個UserRepository,因為是響應(yīng)式編程所以這里繼承ReactiveMongoRepository,代碼如下:
package com.dalaoyang.repository;
import com.dalaoyang.entity.UserInfo;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
public interface UserRepository extends ReactiveMongoRepository<UserInfo,Long> {
}
handler層
新建一個UserHandler,其中分別創(chuàng)建了四個方法,分別是:
- saveUser:新增方法,利用request.bodyToMono獲取POST請求的body對象。
- deleteUser:刪除方法,利用request.pathVariable獲取請求路徑的對應(yīng)參數(shù)ID。
- getUser:獲取對象方法,利用request.pathVariable獲取請求路徑的對應(yīng)參數(shù)ID。
- listUser:獲取對象列表方法,這里沒有參數(shù)。
完整代碼如下:
package com.dalaoyang.handler;
import com.dalaoyang.entity.UserInfo;
import com.dalaoyang.repository.UserRepository;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import static org.springframework.http.MediaType.APPLICATION_JSON;
@Component
public class UserHandler {
private final UserRepository repository;
public UserHandler(UserRepository repository) {
this.repository = repository;
}
//http://localhost:8888/saveUser
public Mono<ServerResponse> saveUser(ServerRequest request) {
Mono<UserInfo> user = request.bodyToMono(UserInfo.class);
return ServerResponse.ok().build(repository.insert(user).then());
}
//http://localhost:8888/deleteUser/1
public Mono<ServerResponse> deleteUser(ServerRequest request) {
Long userId = Long.valueOf(request.pathVariable("id"));
return ServerResponse.ok().build(repository.deleteById(userId).then());
}
//http://localhost:8888/user/1
public Mono<ServerResponse> getUser(ServerRequest request) {
Long userId = Long.valueOf(request.pathVariable("id"));
Mono<UserInfo> userInfo = repository.findById(userId);
return ServerResponse.ok().contentType(APPLICATION_JSON).body(userInfo, UserInfo.class);
}
//http://localhost:8888/listUser
public Mono<ServerResponse> listUser(ServerRequest request) {
Flux<UserInfo> userList = repository.findAll();
return ServerResponse.ok().contentType(APPLICATION_JSON).body(userList, UserInfo.class);
}
}
配置路由
在路由中分別配置剛剛寫的4個方法路由跳轉(zhuǎn),完整代碼如下:
package com.dalaoyang.router;
import com.dalaoyang.handler.UserHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
@Configuration
public class UserRouter {
@Bean
public RouterFunction<ServerResponse> routeCity(UserHandler userHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/listUser")
.and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
userHandler::listUser)
.andRoute(RequestPredicates.GET("/user/{id}")
.and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
userHandler::getUser)
.andRoute(RequestPredicates.GET("/deleteUser/{id}")
.and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
userHandler::deleteUser)
.andRoute(RequestPredicates.POST("/saveUser")
.and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
userHandler::saveUser);
}
}
到這一步完成,項目已經(jīng)構(gòu)建完成。
運(yùn)行測試
啟動Mongodb
本文就不對如何安裝以及啟動MongoDb數(shù)據(jù)庫進(jìn)行介紹了,具體可以查看菜鳥教程,個人覺得這里已經(jīng)介紹的很詳細(xì)了,并且包含了各個系統(tǒng)的操作。
啟動項目
運(yùn)行剛剛的項目,這里以postman測試為例子,在postman內(nèi)Post請求保存方法(http://localhost:8888/saveUser),如圖:
然后在請求查詢用戶方法(http://localhost:8888/user/1),如圖所示,證明剛剛已經(jīng)保存成功,下方body處為返回數(shù)據(jù):
我們在多次請求新增用戶方法,將Id分別修改為2,3,4,5并執(zhí)行保存方法,這里就不一一截圖,然后方法查詢用戶列表方法(http://localhost:8888/listUser),如圖所示:
最后調(diào)用刪除用戶方法(http://localhost:8888/deleteUser/1),這里以刪除ID為1的用戶為例,調(diào)用后在查看所有類別如圖,用戶ID為1的已經(jīng)被刪除了:
總結(jié)
SpringBoot使用WebFlux響應(yīng)式編程操作Mongodb數(shù)據(jù)庫這里已經(jīng)簡單整合完了,雖然和之前操作數(shù)據(jù)庫有些不同,但是其實(shí)大致過程也都相似。
源碼下載 :大老楊碼云