博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot使用WebFlux响应式编程操作数据库
阅读量:7109 次
发布时间:2019-06-28

本文共 7426 字,大约阅读时间需要 24 分钟。

这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库。

前言

在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring WebFlux还没有支持类似Mysql这样的关系型数据库,所以本文以MongoDb数据库为例。

SpringBoot使用WebFlux响应式编程操作数据库

接下来介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库。

新建项目

pom文件

新建项目,在项目中加入webflux依赖和mongodb-reactive依赖,完整pom代码如下:

4.0.0
com.dalaoyang
springboot_mongodb2
0.0.1-SNAPSHOT
jar
springboot_mongodb2
springboot_mongodb2
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-data-mongodb-reactive
org.springframework.boot
spring-boot-starter-webflux
org.springframework.boot
spring-boot-devtools
runtime
org.springframework.boot
spring-boot-starter-test
test
io.projectreactor
reactor-test
test
org.springframework.boot
spring-boot-maven-plugin
复制代码

配置文件

配置文件中配置mongodb数据库信息,之前文章有介绍,这里就不介绍了,配置文件代码如下:

##端口号server.port=8888##mongo配置spring.data.mongodb.host=127.0.0.1spring.data.mongodb.port=27017spring.data.mongodb.database=test复制代码

启动类

启动类是默认生成的,没有做任何修改,代码如下:

package com.dalaoyang;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic 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
{}复制代码

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;@Componentpublic class UserHandler {    private final UserRepository repository;    public UserHandler(UserRepository repository) {        this.repository = repository;    }    //http://localhost:8888/saveUser    public Mono
saveUser(ServerRequest request) { Mono
user = request.bodyToMono(UserInfo.class); return ServerResponse.ok().build(repository.insert(user).then()); } //http://localhost:8888/deleteUser/1 public Mono
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
getUser(ServerRequest request) { Long userId = Long.valueOf(request.pathVariable("id")); Mono
userInfo = repository.findById(userId); return ServerResponse.ok().contentType(APPLICATION_JSON).body(userInfo, UserInfo.class); } //http://localhost:8888/listUser public Mono
listUser(ServerRequest request) { Flux
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;@Configurationpublic class UserRouter {    @Bean    public RouterFunction
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请求保存方法(),如图:

然后在请求查询用户方法(),如图所示,证明刚刚已经保存成功,下方body处为返回数据:

我们在多次请求新增用户方法,将Id分别修改为2,3,4,5并执行保存方法,这里就不一一截图,然后方法查询用户列表方法(),如图所示:

最后调用删除用户方法(),这里以删除ID为1的用户为例,调用后在查看所有类别如图,用户ID为1的已经被删除了:

总结

SpringBoot使用WebFlux响应式编程操作Mongodb数据库这里已经简单整合完了,虽然和之前操作数据库有些不同,但是其实大致过程也都相似。

源码下载 :

转载地址:http://vtvhl.baihongyu.com/

你可能感兴趣的文章
Leetcode Simplify Path
查看>>
Kafka吞吐量测试案例
查看>>
easyui datagrid 前后台代码
查看>>
洛谷P1416 进攻火星 数学
查看>>
学习Verilog的一个博客
查看>>
Python Selenium常见用法介绍
查看>>
Generating Complex Procedural Terrains Using GPU
查看>>
商品标签例子——CSS3 transform 属性
查看>>
Android Xposed框架中创建模块的指导手册
查看>>
hdu 1006 Tick and Tick
查看>>
requirejs+angularjs搭建时手动创建app顶级模块
查看>>
JS中的单引号和双引号
查看>>
ios手机竖屏拍照图片旋转90°问题解决方法
查看>>
全屏显示窗口及无标题
查看>>
编码与copy
查看>>
乐视(LeTV)占用8080端口
查看>>
s28 LNMP架构服务搭建
查看>>
import * as x from 'xx' 和 import x from 'xx'
查看>>
Python Django 之 Template 模板的使用
查看>>
window与document对象的学习
查看>>