相关文章推荐
玩足球的人字拖  ·  如何在Vue组件中调用封装好的外部js文件方 ...·  1 月前    · 
腼腆的柠檬  ·  SQL注入(二)手工注入流程,实战,文件读写 ...·  1 月前    · 
飘逸的米饭  ·  datetime和timestamp的区别-天翼云·  2 周前    · 
好帅的海龟  ·  pandas日常数据处理-天翼云·  昨天    · 
非常酷的仙人掌  ·  用sqlplus远程连接oracle命令 ...·  6 月前    · 
鬼畜的大象  ·  新版Microsoft ...·  8 月前    · 
销魂的海龟  ·  如何在XMLReader中使用TagHand ...·  2 年前    · 
博学的保温杯  ·  spring boot - ...·  2 年前    · 
很酷的莴苣  ·  Android-RSA分段加密解密 - 简书·  2 年前    · 
Code  ›  WebFlux系列之MongoDB数据操作-天翼云
mysql mongodb 天翼云 天翼
https://www.ctyun.cn/zhishi/p-222119
打篮球的拐杖
6 月前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 翼云超值购 HOT 爆款2核2G 2M云服务器低至35元/年
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 推荐有礼 推荐新人实名注册有好礼,下单更得千元代金券!
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城 进入云市场
办公协同
  • WPS云文档 EMM手机管家 智能商业平台 SSL证书 新域名服务 翼电子教室 翼智慧显示一体化解决方案 税务风控云 翼信息化运维服务 翼视频云归档解决方案 云管家2.0 智慧工厂_生产流程管理解决方案 全栈混合云敏捷版(软件) 全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴
天翼云东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划 专家技术服务

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 天翼云·创新直播间 2024智算云生态大会 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

WebFlux系列之MongoDB数据操作

首页 知识中心 数据库 文章详情页

WebFlux系列之MongoDB数据操作

2023-06-08 06:22:02 阅读次数:110

mongodb, 数据库

WebFlux对于数据库操作的支持,尤其是函数式CRUD编程。

直入主题,引入依赖Spring Data Reactive 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
@Document
@Data
public class User {
@Id
private String id;
private String username;
private String address;
}

继承自ReactiveMongoRepository的空接口,即可完成绝大多数实体类操作,当然支持自定义:

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

简单CRUD

@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;

@PostMapping("/")
public Mono<User> addUser(@RequestBody User user) {
return userRepository.save(user);
}

@GetMapping("/")
public Flux<User> getAll() {
return userRepository.findAll();
}

@GetMapping(value = "/stream/all", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<User> streamGetAll() {
return userRepository.findAll();
}

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

@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteUser(@PathVariable String id) {
return userRepository.findById(id)
.flatMap(user -> userDao.delete(user).then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK))))
.defaultIfEmpty(new ResponseEntity(HttpStatus.NOT_FOUND));
}

@PutMapping("/")
public Mono<ResponseEntity<User>> updateUser(@RequestBody User user) {
return userRepository.findById(user.getId())
.flatMap(u -> userDao.save(user))
.map(u->new ResponseEntity<User>(u,HttpStatus.OK))
.defaultIfEmpty(new ResponseEntity(HttpStatus.NOT_FOUND));
}
}

提供两个查询接口,一个返回 Flux,里边包含多个对象;一个设置响应Content-Type 为 text/event-stream,通过响应式流返回数据

可见两种不同的查询方式返回的数据格式也有差异。前者是以数组形式一次性返回数据,后者是以 SSE 的形式多次返回数据。

请求地址路由

在 SpringMVC 中,可以通过如下一些注解来控制请求 URL 和处理器之间的映射关系:
@RequestMapping
@GetMapping
@PostMapping
@DeleteMapping
@PutMapping

这些注解在 WebFlux 中依然还可以继续使用,WebFlux 也提供了自己的方案–Router。

开发处理器

@Component
public class UserHandler {
@Autowired
private UserRepository userRepository;

public Mono<ServerResponse> addUser(ServerRequest serverRequest) {
return ok().contentType(APPLICATION_JSON)
.body(userRepository.saveAll(serverRequest.bodyToMono(User.class)), User.class);
}

public Mono<ServerResponse> deleteUser(ServerRequest serverRequest) {
return userRepository.findById(parseLong(serverRequest.pathVariable("id")))
.flatMap(p -> userRepository.delete(p).then(ok().build()))
.switchIfEmpty(notFound().build());
}

public Mono<ServerResponse> getAllUser(ServerRequest serverRequest) {
return ok().contentType(APPLICATION_JSON)
.body(userRepository.findAll(), User.class);
}
}
  • 处理器需要使用@Component注入到 Spring 容器中
  • 所有方法的返回值类型都是​ ​Mono<ServerResponse>​ ​,参数类型都是 ServerRequest,因为一会配置 Router 时涉及到的 HandlerFunction 里边就是这样定义的,换句话说,这里定义的每一个方法都满足 HandlerFunction 函数式接口
  • 配置路由
    将请求的 URL 地址和这些处理器之间关联起来:

    @Configuration
    public class RouterConfiguration {
    @Bean
    RouterFunction<ServerResponse> userRouter(UserHandler userHandler) {
    return RouterFunctions.nest(RequestPredicates.path("/user"),
    RouterFunctions.route(RequestPredicates.POST("/"), userHandler::addUser)
    .andRoute(RequestPredicates.GET("/"), userHandler::getAllUser)
    .andRoute(RequestPredicates.DELETE("/{id}"), userHandler::deleteUser));
    }
    }
  • 配置类类似于SpringMVC 中的 DispatcherServlet,负责请求的分发,根据不同的请求 URL找到对应的处理器去处理
  • 通过RouterFunctions工具类来创建 RouterFunction 实例,nest方法第一个参数配置地址的前缀,类似于在 Controller 类上直接写 @RequestMapping 注解去配置地址
  • nest 方法的第二个参数就是 RouterFunction 实例,每一个 RouterFunction 实例通过 RouterFunctions.route 方法来构建,第一个参数就是请求的 URL 地址(注意配置地址都有一个共同前缀),第二个参数通过方法引用的方式配置HandlerFunction,即当前请求对应的处理器
  • 通过 addRoute 方法可以配置多个路由策略
  • 版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_15851118/5807230,作者:johnny233,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇: TypeScript-可选属性和索引签名

    下一篇: 第1章 Hive基本概念

    相关文章

    2024-11-08 09:00:57

    Java中的高效数据查询与索引优化

    在开发和维护大规模数据应用时,高效的数据查询和索引优化是确保系统性能和响应速度的关键因素。

    2024-11-08 09:00:57
    2024-11-08 09:00:57

    Java中的内存数据库与缓存技术

    内存数据库是一种将数据存储在系统内存中的数据库管理系统(DBMS)。相比传统的磁盘存储数据库,内存数据库能够提供更快的读写速度和更低的延迟,适合需要高性能和低响应时间的应用场景。

    2024-11-08 09:00:57
    2024-11-07 08:15:30

    MySQL:CRUD初阶(有图有实操)

    MySQL:CRUD初阶(有图有实操)

    2024-11-07 08:15:30
    2024-11-07 07:57:04

    数据库加载驱动问题(java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver)

    数据库加载驱动问题(java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver)

    2024-11-07 07:57:04
    mysql 2024-11-06 07:24:56

    如何优化Java中的数据库连接池配置?

    数据库连接池(Connection Pool)是一个非常重要的组件,它可以极大地提高数据库访问的性能和效率。合理配置和优化连接池,可以显著提升应用程序的响应速度和吞吐量。

    2024-11-06 07:24:56
    2024-11-06 07:24:56

    基于Java的房产销售交易平台设计与实现

    基于Java的房产销售交易平台设计与实现

    2024-11-06 07:24:56
    2024-11-06 07:20:45

    Spring Boot应用的数据库连接池管理

    数据库连接池是Spring Boot应用与数据库交互的重要组成部分,它帮助应用管理数据库连接,提高资源利用率和系统性能。Spring Boot内置了对多种数据库连接池的支持,包括HikariCP、Tomcat、Apache DBCP2和Commons DBCP。

    2024-11-06 07:20:45
    Spring 2024-11-05 08:58:14

    大数据ClickHouse进阶(十三):ClickHouse的GROUP BY 子句

    Group By子句又称聚合查询,与MySQL或者Hive中的使用方式一样,但是需要注意一点在Select查询中如果有聚合查询,例如max,min等,与聚合查询出现的字段一定要出现在Group by中,否则语句报错。

    2024-11-05 08:58:14
    hadoop 2024-11-01 09:15:10

    Mysql--表注释,字段注释

    information_schema数据库是MySQL数据库自带的数据库,里面存放的MySQL数据库所有的信息,包括数据表、数据注释、数据表的索引、数据库的权限等等。

    2024-11-01 09:15:10
    MySQL 2024-11-01 09:14:57

    Mongodb--用户/权限

    mongodb分为管理员用户和普通用户,并且还有个验证库,建立用户时use到的库(验证库),信息就存储在admin数据库下。

    2024-11-01 09:14:57
    查看更多
    推荐标签

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    25339

    阅读量

    3055726

    查看更多

    最新文章

    MySQL:CRUD初阶(有图有实操)

    2024-11-07 08:15:30

    数据库加载驱动问题(java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver)

    2024-11-07 07:57:04

    大数据ClickHouse进阶(十三):ClickHouse的GROUP BY 子句

    2024-11-05 08:58:14

    Mysql--表注释,字段注释

    2024-11-01 09:15:10

    Mongodb--用户/权限

    2024-11-01 09:14:57

    MybatisPlus快速入门

    2024-10-30 08:06:48

    查看更多

    热门文章

    Nacos数据持久化到MySQL

    2023-05-12 07:20:56

    MySQL的间隙锁

    2023-05-12 07:20:56

    ​云原生微服务K8s容器编排第七章之ETCD的使用及备份

    2023-03-16 07:45:55

    oracle 数据库 中 如何将不带汉字的日期格式转换成带“年月日时分秒”格式的日期

    2023-04-06 06:11:29

    【Error】kettle连接MySQL

    2023-05-17 06:58:39

    JSP之 MySQL 插入数据时,中文乱码问题的解决

    2022-11-14 02:56:39

    查看更多

    热门标签

    mysql MySQL redis oracle python linux leetcode Oracle
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    Linux The server quit without updating PID file的几种解决方法

    OCP多租户

    10--Mybatis的多表操作

    【Mysql第十一期 约束】

    基于springboot+jpa 实现多租户动态切换多数据源 - 数据隔离方案选择分库还是分表

    Patroni for opengauss 12:pick_synchronous_standby

    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    • 天翼云APP
      天翼云APP
     
    推荐文章
    玩足球的人字拖  ·  如何在Vue组件中调用封装好的外部js文件方法-天翼云
    1 月前
    腼腆的柠檬  ·  SQL注入(二)手工注入流程,实战,文件读写-天翼云
    1 月前
    飘逸的米饭  ·  datetime和timestamp的区别-天翼云
    2 周前
    好帅的海龟  ·  pandas日常数据处理-天翼云
    昨天
    非常酷的仙人掌  ·  用sqlplus远程连接oracle命令 _51CTO博客_sqlplus连接oracle命令
    6 月前
    鬼畜的大象  ·  新版Microsoft Edge启用IE模式_edge ie mode-CSDN博客
    8 月前
    销魂的海龟  ·  如何在XMLReader中使用TagHandler.handleTag(.) - 问答 - 腾讯云开发者社区-腾讯云
    2 年前
    博学的保温杯  ·  spring boot - java.lang.OutOfMemoryError: GC overhead limit exceeded during Jmeter load testing - Stack Overflow
    2 年前
    很酷的莴苣  ·  Android-RSA分段加密解密 - 简书
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号