SpringBoot使用WebFlux響應式編程操作數據庫


這一篇文章介紹SpringBoot使用WebFlux響應式編程操作MongoDb數據庫。

前言

在之前一篇簡單介紹了WebFlux響應式編程的操作,我們在來看一下下圖,可以看到,在目前的Spring WebFlux還沒有支持類似Mysql這樣的關系型數據庫,所以本文以MongoDb數據庫為例。

SpringBoot使用WebFlux響應式編程操作數據庫

接下來介紹SpringBoot使用WebFlux響應式編程操作MongoDb數據庫。

新建項目

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數據庫信息,之前文章有介紹,這里就不介紹了,配置文件代碼如下:

##端口號
server.port=8888


##mongo配置
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=test

啟動類

啟動類是默認生成的,沒有做任何修改,代碼如下:

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

創建實體類

新建一個實體類UserInfo,代碼內容沒有什么特殊的,這里就不做介紹了,實體類完整代碼如下:

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

數據操作層

新建一個UserRepository,因為是響應式編程所以這里繼承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,其中分別創建了四個方法,分別是:

  • saveUser:新增方法,利用request.bodyToMono獲取POST請求的body對象。
  • deleteUser:刪除方法,利用request.pathVariable獲取請求路徑的對應參數ID。
  • getUser:獲取對象方法,利用request.pathVariable獲取請求路徑的對應參數ID。
  • listUser:獲取對象列表方法,這里沒有參數。

完整代碼如下:

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個方法路由跳轉,完整代碼如下:

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

到這一步完成,項目已經構建完成。

運行測試

啟動Mongodb

本文就不對如何安裝以及啟動MongoDb數據庫進行介紹了,具體可以查看菜鳥教程,個人覺得這里已經介紹的很詳細了,並且包含了各個系統的操作。

啟動項目

運行剛剛的項目,這里以postman測試為例子,在postman內Post請求保存方法(http://localhost:8888/saveUser),如圖:

然后在請求查詢用戶方法(http://localhost:8888/user/1),如圖所示,證明剛剛已經保存成功,下方body處為返回數據:

我們在多次請求新增用戶方法,將Id分別修改為2,3,4,5並執行保存方法,這里就不一一截圖,然后方法查詢用戶列表方法(http://localhost:8888/listUser),如圖所示:

最后調用刪除用戶方法(http://localhost:8888/deleteUser/1),這里以刪除ID為1的用戶為例,調用后在查看所有類別如圖,用戶ID為1的已經被刪除了:

總結

SpringBoot使用WebFlux響應式編程操作Mongodb數據庫這里已經簡單整合完了,雖然和之前操作數據庫有些不同,但是其實大致過程也都相似。

源碼下載 :大老楊碼雲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM