这一篇文章介绍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数据库这里已经简单整合完了,虽然和之前操作数据库有些不同,但是其实大致过程也都相似。

源码下载 :大老杨码云

SpringBoot使用WebFlux响应式编程操作数据库的更多相关文章

  1. springboot2 webflux 响应式编程学习路径

    springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑问将会成为未来技术的趋势,是必学 ...

  2. [转]springboot2 webflux 响应式编程学习路径

    原文链接 spring官方文档 springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑 ...

  3. springboot 使用webflux响应式开发教程(二)

    本篇是对springboot 使用webflux响应式开发教程(一)的进一步学习. 分三个部分: 数据库操作webservicewebsocket 创建项目,artifactId = trading- ...

  4. SpringBoot 2.x (14):WebFlux响应式编程

    响应式编程生活案例: 传统形式: 一群人去餐厅吃饭,顾客1找服务员点餐,服务员把订单交给后台厨师,然后服务员等待, 当后台厨师做好饭,交给服务员,经过服务员再交给顾客1,依此类推,该服务员再招待顾客2 ...

  5. 07-Spring5 WebFlux响应式编程

    SpringWebFlux介绍 简介 SpringWebFlux是Spring5添加的新模块,用于Web开发,功能和SpringMvc类似的,WebFlux使用当前一种比较流行的响应式编程框架 使用传 ...

  6. springboot 使用webflux响应式开发教程(一)

    什么是webFlux 左侧是传统的基于Servlet的Spring Web MVC框架,右侧是5.0版本新引入的基于Reactive Streams的Spring WebFlux框架,从上到下依次是R ...

  7. Spring WebFlux 响应式编程学习笔记(一)

    各位Javaer们,大家都在用SpringMVC吧?当我们不亦乐乎的用着SpringMVC框架的时候,Spring5.x又悄(da)无(zhang)声(qi)息(gu)的推出了Spring WebFl ...

  8. 【SpringBoot】SpringBoot2.0响应式编程

    ========================15.高级篇幅之SpringBoot2.0响应式编程 ================================ 1.SprinBoot2.x响应 ...

  9. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

随机推荐

  1. NIO(四)

    使用非直接缓冲区和直接缓冲区复制同一个文件,看一下时间差别 1.创建非直接缓冲区测试类 package com.cppdy.nio; import java.io.FileInputStream; i ...

  2. day10 函数2

    为什么需要函数? 先使用目前的知识点实现一个需求: """ 三个功能   1.登录   2.购物车   3.收藏夹       收藏夹和 购物车 需要先登录才能使用!   ...

  3. java Swing组件和事件处理

    1.常见的容器 JComponent是 Container 的子类,中间容器必须添加到底层容器中才能够发挥作用, JPanel 面板 :使用jPanel 创建一个面板,再通过添加组件到该面板上面,JP ...

  4. Jmeter 获取CSV行数

    import java.io.BufferedReader; import java.io.FileInputStream; String str = "E:\\Desktop\\WOS接口 ...

  5. python 装饰器(1)

    # 装饰器,对一个函数打扮 # def foo():# print("foo")# foo# foo()# def test1():# print('-----1-----')# ...

  6. windows环境下永久修改pip镜像源的方法(转)

    一.在windows环境下修改pip镜像源的方法(以python3.7为例) (1):在windows文件管理器中,输入 %APPDATA%,cmd里面输入即可. (2):会定位到一个新的目录下,在该 ...

  7. error: each element of 'ext_modules' option must be an Extension instance or 2-tuple

    在编译cython扩展时出现. 解决办法: 必须先import setup再import extension,否则报错 from setuptools import setup from distut ...

  8. 洛谷---小L和小K的NOIP考后放松赛

    链接: https://www.luogu.org/contestnew/show/11805?tdsourcetag=s_pcqq_aiomsg 题解: 没人过的题我就没看 t2: 考虑每个点是朋友 ...

  9. [转]PL/SQL Developer 导入导出csv文件

    PL/SQL Developer 可以导入或者导出CSV文件. 导入CSV文件步骤: 1.选择tools->text importer.... 2.选择第二个Data to oracle选项卡, ...

  10. SQLServer中处理亿万级别的数据

    在SQLServer中处理亿万级别的数据(历史数据),可以按以下方面进行: 去掉表的所有索引 用SqlBulkCopy进行插入 分表或者分区,减少每个表的数据总量 在某个表完全写完之后再建立索引 正确 ...