WebFlux集成MongoDB

news2025/1/16 3:31:02

目录

前言

1.简单集成MongoDB

2. yml配置

3.创建用户实体类

4.创建用户CRUD数据访问接口类

5.Controller层

6.postman测试访问

7.代码附在本博文绑定资源 


前言

        MongoDB广泛应用于非关系型数据库的存储,其主要存储的数据类型有字符串,整数、浮点数,日期、数组和嵌套文档等,这些数据结构,使得它在存储半结构化和非结构化数据占有一定的优势。

        MongoDB的特点:高性能、可扩展性、高可用性。

        高性能:MongoDB使用内存映射技术讲数据存储在内存中,通过预读和缓存来提高数据访问速度,支持索引查询优化,加快查询速度。

         可扩展性:MongDB支持水平扩展和垂直扩展,可通过增加新节点来提高吞吐量和存储容量,通过自身分片技术,可以将数据分布在多个节点,实现高可用和负载均衡。

        高可用性:MongoDB支出自动分片,在集群中,可设置一个主副本和多个副本,当主副本发生故障时,可以自主选举新的主副本,保证系统的持续可用。

1.简单集成MongoDB

        1.1   引入相关依赖

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
        </dependency>

2. yml配置

spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/webflux

3.创建用户实体类

package com.example.spring.mono.entity;

import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import javax.validation.constraints.NotBlank;

/**
 * @program: webflux-demo
 * @description: User实体类
 * @author: 01
 * @create: 2018-10-04 20:25
 **/

@Data
@Document(collection = "user")
public class User {

    @Id
    private String id;

    @NotBlank(message = "用户名称不可以为空")
    private String name;

    @Range(min = 10, max = 100, message = "用户年龄需在10-100岁之间")
    private int age;
}

4.创建用户CRUD数据访问接口类

package com.example.spring.mono.repository;

import com.example.spring.mono.entity.User;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;

/**
 * @program: webflux-demo
 * @description: user dao层接口
 * @author: 01
 * @create: 2018-10-04 20:27
 **/

@Repository
public interface UserRepository extends ReactiveMongoRepository<User, String> {


}

5.Controller层

package com.example.spring.mono.controller;

import com.example.spring.mono.entity.User;
import com.example.spring.mono.repository.UserRepository;
import com.example.spring.mono.utils.CheckUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.validation.Valid;

/**
 * @program: webflux-demo
 * @description: User 接口
 * @author: 01
 * @create: 2018-10-04 20:29
 **/

@RestController
@RequestMapping("/user")
public class UserController {

    private final UserRepository userRepository;

    @Autowired
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    /**
     * 以数组形式一次返回全部数据
     */
    @GetMapping(value = "/get_all")
    public Flux<User> getAll() {
        return userRepository.findAll();
    }

    /**
     * 以SSE形式多次返回数据
     */
    @GetMapping(value = "/stream/all", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<User> streamGetAll() {
        return userRepository.findAll();
    }

    /**
     * 添加用户
     *
     * @param user user
     * @return 新增的用户数据
     */
    @PostMapping("/save")
    public Mono<User> createUser(@Valid @RequestBody User user) {
        // 新增和修改都是save,有id是修改,无id则是新增
        user.setId(null);
        // 检查用户名是否符合规则
        CheckUtil.checkName(user.getName());

        return userRepository.save(user);
    }

    /**
     * 根据id删除用户
     *
     * @param id id
     * @return 用户存在返回200,不存在则返回404
     */
    @DeleteMapping("/del/{id}")
    public Mono<ResponseEntity<Void>> deleteUser(@PathVariable("id") String id) {
        // deleteById没有返回值,不能判断数据是否存在,所以一般来说实现删除逻辑时不能直接使用
        // userRepository.deleteById(id);

        // 当你要操作数据,并返回一个Mono这个时候使用flatMap。如果不操作数据,只是转换数据,并返回一个Mono时使用map
        return userRepository.findById(id).flatMap(user -> userRepository.delete(user)
                // 用户存在,删除成功
                .then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK))))
                // 用户不存在,删除失败
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    /**
     * 修改用户数据
     *
     * @param id   id
     * @param user user
     * @return 用户数据存在时,返回200和修改后的数据,不存在则返回404
     */
    @PutMapping("/update/{id}")
    public Mono<ResponseEntity<User>> updateUser(@PathVariable("id") String id,
                                                 @Valid @RequestBody User user) {
        CheckUtil.checkName(user.getName());
        return userRepository.findById(id)
                // flatMap操作数据
                .flatMap(u -> {
                    BeanUtils.copyProperties(user, u);
                    u.setId(id);
                    return userRepository.save(u);
                })
                // map转换数据,用户数据存在,修改成功
                .map(u -> new ResponseEntity<>(u, HttpStatus.OK))
                // 用户数据不存在,修改失败
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    /**
     * 根据id查找用户
     *
     * @param id id
     * @return 用户存在返回200和用户信息,不存在则返回404
     */
    @GetMapping("/find/{id}")
    public Mono<ResponseEntity<User>> findUserById(@PathVariable("id") String id) {
        return userRepository.findById(id)
                // 用户存在返回200和用户信息
                .map(user -> new ResponseEntity<>(user, HttpStatus.OK))
                // 不存在则返回404
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    /**
     * 根据年龄段查找用户数据
     *
     * @param start start
     * @param end   end
     * @return 以数组形式一次返回全部用户数据
     */
    @GetMapping("/age/{start}/{end}")
    public Flux<User> findByAge(@PathVariable("start") int start,
                                @PathVariable("end") int end) {
        return userRepository.findByAgeBetween(start, end);
    }

    /**
     * 根据年龄段查找用户数据
     *
     * @param start start
     * @param end   end
     * @return 以SSE形式多次返回用户数据
     */
    @GetMapping(value = "/stream/age/{start}/{end}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<User> streamFindByAge(@PathVariable("start") int start,
                                      @PathVariable("end") int end) {
        return userRepository.findByAgeBetween(start, end);
    }

    /**
     * 查找20-45岁用户数据
     *
     * @return 以数组形式一次返回全部用户数据
     */
    @GetMapping("/old")
    public Flux<User> oldUser() {
        return userRepository.oldUser();
    }

    /**
     * 查找20-45岁用户数据
     *
     * @return 以SSE形式多次返回用户数据
     */
    @GetMapping(value = "/stream/old", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<User> streamOldUser() {
        return userRepository.oldUser();
    }
}

6.postman测试访问

7.代码附在本博文绑定资源 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NAS 软件大盘点:瞧瞧哪个被你遗漏了

很多人都听说过NAS&#xff0c;也有很多人正在使用NAS&#xff0c;而NAS用户通常需要安装一些软件来扩展其功能&#xff0c;毕竟NAS的功能实在是太多了&#xff0c;光是部署与调试就要耗费大量的时间&#xff0c; 小宝集合了NAS相关实用工具&#xff0c;无论是群晖、威联通还是…

3、从0搭建企业门户网站——JDK下载、安装与环境变量配置

目录 ​编辑 正文 1、JDK下载 2、JDK安装 2.1 建立存放目录 2.2 上传文件 2.3 解压 3、JDK环境变量配置 4、检查JDK版本 正文 在CentOs7.5上,安装JDK是必要的,因为我们的网站软件是Java语言开发。下面我们以安装JDK 17为例,介绍整个JDK安装过程。 1、JDK下载 JDK…

Vitis通过TCF远程调试ZYNQ Linux

昨天已经在矿渣板上把petalinux跑起来了&#xff0c;今天准备尝试一下vitis通过TCF远程调试ZYNQ Linux代码&#xff0c;官方和第三方的各种教程满天飞&#xff0c;但还是有几个坑的&#xff0c;教程没说清楚。 1.打开vitis&#xff0c;用vivado导出的xsa文件新建一个platform工…

ChinaJoy 2024,VERYCLOUD睿鸿股份与你相聚

&#x1f3ae;2024 ChinaJoy于26日正式开幕 &#x1f557;7月26-28日 &#x1f310;VERYCLOUD睿鸿股份在BTOB商务洽谈馆 &#x1f31f;W4-B785展位 &#x1f387;展台交流好礼相送 与多行业好友现场相聚、畅谈&#x1f9d0; 现场游戏企业云集 专业观众、玩家纷至沓来 与游戏/短…

新一代分割一切大模型SAM2(Segment Anything Model 2)介绍,可轻松分割图片与视频

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

KylinOS V10系统上安装yashan数据库单机版

一、服务器准备 这里安装的KylinOS V10桌面版本。 二、依赖项准备 安装桌面版的依赖包都安装好了。 https://doc.yashandb.com/yashandb/23.2/zh/%E5%AE%89%E8%A3%85%E5%92%8C%E5%8D%87%E7%BA%A7/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/%E5%AE%89%E8%A3%85%E5%89%8D%E5%87%86…

net start mysql; 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助。 也许你只是写错了名字!!!!!

看样子不知道问题出在哪里,看了别人的文章也不行。 打开服务&#xff08;命令行输入services.msc&#xff09;&#xff01;&#xff01; 人家叫mysql80 成了~ 就很无语

创邻科技Galaxybase银河图数据库赋能供应链高效协同

随着全球环境从乌卡时代走向巴尼时代&#xff0c;供应链管理能力与水平决定了企业的存生与盈利水平。数据是体现供应链运营状态与价值的核心要素&#xff0c;借助最新的数据处理技术最大限度挖掘数据价值&#xff0c;实现供应链可预测、可追溯、可实时响应&#xff0c;提升供应…

外卖项目day11---用户下单

OrderController代码 RestController("userOrderController") RequestMapping("/user/order") Api(tags "用户端订单相关接口") Slf4j public class OrderController {Autowiredprivate OrderService orderService;/*** 用户下单* param orders…

华硕电脑怎么录屏?3个高效实用的方法

华硕电脑作为一款备受青睐的电脑品牌&#xff0c;拥有丰富的功能和工具&#xff0c;其中包括强大的录屏功能。然而&#xff0c;对于许多华硕电脑用户来说&#xff0c;如何利用这一功能可能会感到困惑。 本文将带您探索华硕电脑的录屏功能&#xff0c;为您揭示华硕电脑怎么录屏…

算法小白的进阶之路(力扣1~5)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Vue3-Vite-TypeScript:屏幕适配rem

① 基于rem 适配&#xff08;推荐&#xff0c;也是本篇要实现的方案&#xff09; 适用场景&#xff1a;不固定宽高比的Web应用&#xff0c;适用于绝大部分业务场景 ② 基于 scale 适配 适用场景&#xff1a;固定宽高比的Web应用&#xff0c;如大屏或者固定窗口业务应用 个人…

使用 openai 和 langchain 调用自定义工具完成提问需求

我们提供了一个函数&#xff0c;接受传入运算的字符串&#xff0c;返回运算的结果。 现在的需求是&#xff0c;我们问 gpt 模型&#xff0c;由于模型计算能力并不好&#xff0c;他要调用计算函数&#xff0c;根据计算结果&#xff0c;回答我们的问题。 使用 openai 实现&#…

资源|Python入门必看书籍,适合零基础小白,附PDF

小编为初学Python的朋友们汇总了7本零基础入门书籍&#xff0c;包括Python三剑客等&#xff0c;都是在编程届多年畅销的书籍&#xff0c;也是众多从业者的选择&#xff0c;全文详细介绍了书籍主要内容&#xff0c;有需要的宝子根据自身情况自取 需要书籍PDF的宝子评论区留言哦 …

Java每日一练_模拟面试题1(死锁)

一、死锁的条件 死锁通常发生在两个或者更多的线程相互等待对方释放资源&#xff0c;从而导致它们都无法继续执行。死锁的条件通常被描述为四个必要条件&#xff0c;也就是互斥条件、不可剥夺条件、占有并等待条件和循环等待条件。 互斥条件&#xff1a;资源不能被共享&#x…

MindMaster的学习(一)建立项目生成思维导图

MindMaster主要是用来做思维导图&#xff0c;当然也能直接生成PPT和甘特图&#xff0c;使用起来非常方便&#xff0c;简单分享下。 1.安装软件&#xff0c;这个随便搜一个破解版&#xff0c;有的就免安装&#xff0c;直接打开就能用。 2.我们新建一个导图&#xff0c;有空白模版…

认证!云起无垠成为人工智能产业发展联盟AIIA成员单位

近日&#xff0c;经人工智能产业发展联盟(AIIA)严格审核&#xff0c;云起无垠正式成为联盟成员单位。这一荣誉不仅肯定了云起无垠在技术方面的实力&#xff0c;更显示了对其未来发展的高度期待。 AIIA在国家发改委、科技部、工信部和网信办的指导下&#xff0c;由中国信息通信…

【iOS】iOS内存五大分区

iOS内存五大分区 总揽 iOS中&#xff0c;内存主要分为五大区域&#xff1a;栈区&#xff0c;堆区&#xff0c;全局区/静态区&#xff0c;常量区和代码区。总览图如下。 这个图我觉得更好记&#xff0c;因为下面是低地址&#xff0c;上面是高地址&#xff0c;是比较符合日常…

idea 2024 中文最新版破解激活永久(图文详细讲解教程)超级简单(亲测可用)

1.官网下载&#xff1a;下载地址 2.点击下载完成之后&#xff0c;找到下载路径&#xff0c;双击运行exe文件&#xff0c;进行安装 3.安装完成后&#xff0c;在桌面找到idea快捷方式&#xff0c;双击运行 4.此时是没有激活的&#xff0c;点击关闭窗口&#xff0c;然后退出程序 5…

nginx代理设置时能获取到源IP地址的方法

nginx通过http_x_forwarded_for限制来访IP示例_ngnix 根据header的x-forwarded-for限制接入-CSDN博客 名称ip客户端地址10.0.23.90nginx服务器地址110.0.202.48:18888&#xff0c;代理到10.0.204.82:8888nginx服务器地址210.0.204.82:8888&#xff0c;代理到10.0.204.82:8887后…