【JAVA】SpringBoot + mongodb 分页、排序、动态多条件查询及事务处理

news2024/11/14 14:32:22

【JAVA】SpringBoot + mongodb 分页、排序、动态多条件查询及事务处理

1.引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

 <!-- mongodb ↓ -->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>
  <!-- mongodb ↑ -->

2.配置application.yml

spring:
  data:
    # mongodb多数据源配置
    mongodb:
      host: 192.168.36.238
      port: 27017
      username: yapi
      password: Qsxdcfr2313!
      database: yapi
      # 验证数据库
      authentication-database: admin
      # 第二个数据库
      low-code:
        uri: mongodb://yapi:Qsxdcfr2313!@192.168.36.238:27017/low-code?authSource=admin
      # 第三个数据库
      event:
        uri: mongodb://yapi:Qsxdcfr2313!@192.168.36.238:27017/event?authSource=admin

3.MongoDB多数据源配置

创建MongoConfig类

package com.xhs.config;

import com.mongodb.client.MongoClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;

import javax.annotation.Resource;

/**
 * @desc: MongoDB多数据源配置
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 16:06:22
 * @version: JDK 1.8
 */

@Configuration
public class MongoConfig {

    @Resource
    private MongoClient mongoClient;

    @Resource
    private MongoProperties mongoProperties;

    /**
     * 默认的数据库
     *
     * @return MongoTemplate
     */
    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient, mongoProperties.getDatabase());
    }

    /**
     * 第二个数据源
     *
     * @param adminUri uri
     * @return MongoTemplate
     */
    @Bean
    public MongoTemplate mongoTemplateLowCode(@Value("${spring.data.mongodb.low-code.uri}") String adminUri) {
        return new MongoTemplate(new SimpleMongoClientDatabaseFactory(adminUri));
    }

    /**
     * 第三个数据源
     *
     * @param adminUri uri
     * @return MongoTemplate
     */
    @Bean
    public MongoTemplate mongoTemplateEvent(@Value("${spring.data.mongodb.event.uri}") String adminUri) {
        return new MongoTemplate(new SimpleMongoClientDatabaseFactory(adminUri));
    }
}

4.创建实体类

创建三个库的实体类

第一库的实体类

package com.xhs.entity.mongo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * @desc: yapi库的user集合
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 023 16:14
 * @version: JDK 1.8
 */
@Data
@Document(collection = "user")
public class User {

    @Id
    private String id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 角色
     */
    private String role;
}

第二个库的实体类

package com.xhs.entity.mongo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

/**
 * @desc: low-code库的low_code_url集合
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 023 16:10
 * @version: JDK 1.8
 */
@Data
@Document(collection = "low_code_url")
public class LowCodeUrl {

    @Id
    private String id;

    /**
     * 系统类型
     */
    private String systemName;

    /**
     * 对象名称
     */
    private String objectName;

    /**
     * 接口地址
     */
    private String interfaceUrl;

    /**
     * 接口类型
     */
    private String interfaceType;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}

第三个库的实体类

package com.xhs.entity.mongo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

/**
 * @desc: event库的event集合
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 023 16:17
 * @version: JDK 1.8
 */
@Data
@Document(collection = "event")
public class Event {

    @Id
    private String id;

    /**
     * 事件名称
     */
    private String eventName;

    /**
     * 事件类型
     */
    private String eventType;

    /**
     * 触发方式
     */
    private String triggerMode;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}

5.创建Controller层

package com.xhs.controller;

import com.xhs.dto.request.AddEventParams;
import com.xhs.dto.request.AddLowCodeUrlParams;
import com.xhs.dto.request.FindLowCodeUrlParams;
import com.xhs.dto.request.PageEventParams;
import com.xhs.message.ReturnResult;
import com.xhs.service.MongoService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * @desc:
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 023 16:19
 * @version: JDK 1.8
 */
@RestController
@RequestMapping("/mongo")
public class MongoController {

    @Resource
    private MongoService mongoService;

    /**
     * 查询所有用户
     *
     * @return ReturnResult<Object>
     */
    @GetMapping("/getUser")
    public ReturnResult<Object> getUser() {
        return mongoService.getUser();
    }

    /**
     * 条件查询 LowCodeUrl
     *
     * @param findLowCodeUrlParams 查询条件
     * @return ReturnResult<Object>
     */
    @PostMapping("/getLowCodeUrl")
    public ReturnResult<Object> getLowCodeUrl(@RequestBody FindLowCodeUrlParams findLowCodeUrlParams) {
        return mongoService.getLowCodeUrl(findLowCodeUrlParams);
    }

    /**
     * 新增 LowCodeUrl 数据
     *
     * @param lowCodeUrlParams LowCodeUrl 数据
     * @return ReturnResult<Object>
     */
    @PostMapping("/addLowCodeUrl")
    public ReturnResult<Object> addLowCodeUrl(@Validated @RequestBody AddLowCodeUrlParams lowCodeUrlParams) {
        return mongoService.addLowCodeUrl(lowCodeUrlParams);
    }

    /**
     * 新增 event 数据
     *
     * @param eventParams LowCodeUrl 数据
     * @return ReturnResult<Object>
     */
    @PostMapping("/addEvent")
    public ReturnResult<Object> addEvent(@Validated @RequestBody AddEventParams eventParams) {
        return mongoService.addEvent(eventParams);
    }

    /**
     * 分页查询 event 数据
     *
     * @param eventParams 查询条件
     * @return ReturnResult<Object>
     */
    @PostMapping("/pageEvent")
    public ReturnResult<Object> pageEvent(@Validated @RequestBody PageEventParams eventParams) {
        return mongoService.pageEvent(eventParams);
    }
}

6.创建Service层

package com.xhs.service;

import com.xhs.dto.request.AddEventParams;
import com.xhs.dto.request.AddLowCodeUrlParams;
import com.xhs.dto.request.FindLowCodeUrlParams;
import com.xhs.dto.request.PageEventParams;
import com.xhs.message.ReturnResult;

/**
 * @desc:
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 023 16:20
 * @version: JDK 1.8
 */
public interface MongoService {

    /**
     * 查询所有用户
     *
     * @return ReturnResult<Object>
     */
    ReturnResult<Object> getUser();

    /**
     * 条件查询 LowCodeUrl
     *
     * @param findLowCodeUrlParams 查询条件
     * @return ReturnResult<Object>
     */
    ReturnResult<Object> getLowCodeUrl(FindLowCodeUrlParams findLowCodeUrlParams);

    /**
     * 新增 LowCodeUrl 数据
     *
     * @param lowCodeUrlParams LowCodeUrl 数据
     * @return ReturnResult<Object>
     */
    ReturnResult<Object> addLowCodeUrl(AddLowCodeUrlParams lowCodeUrlParams);


    /**
     * 新增 event 数据
     *
     * @param eventParams LowCodeUrl 数据
     * @return ReturnResult<Object>
     */
    ReturnResult<Object> addEvent(AddEventParams eventParams);

    /**
     * 分页查询 event 数据
     *
     * @param eventParams 查询条件
     * @return ReturnResult<Object>
     */
    ReturnResult<Object> pageEvent(PageEventParams eventParams);
}

7.创建ServiceImpl层

package com.xhs.service.impl;

import com.xhs.dto.request.AddEventParams;
import com.xhs.dto.request.AddLowCodeUrlParams;
import com.xhs.dto.request.FindLowCodeUrlParams;
import com.xhs.dto.request.PageEventParams;
import com.xhs.dto.response.PageResult;
import com.xhs.entity.mongo.Event;
import com.xhs.entity.mongo.LowCodeUrl;
import com.xhs.entity.mongo.User;
import com.xhs.message.Result;
import com.xhs.message.ReturnResult;
import com.xhs.service.MongoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @desc:
 * @projectName: spring-boot-demo
 * @author: xhs
 * @date: 2023-11-23 023 16:20
 * @version: JDK 1.8
 */
@Slf4j
@Service
public class MongoServiceImpl implements MongoService {

    @Resource
    @Qualifier("mongoTemplate")
    private MongoTemplate mongoTemplate;

    @Resource
    @Qualifier("mongoTemplateLowCode")
    private MongoTemplate mongoTemplateLowCode;

    @Resource
    @Qualifier("mongoTemplateEvent")
    private MongoTemplate mongoTemplateEvent;


    /**
     * 查询所有用户
     *
     * @return ReturnResult<Object>
     */
    @Override
    public ReturnResult<Object> getUser() {
        List<User> users = mongoTemplate.find(new Query(), User.class);
        return ReturnResult.build(Result.QUERY_SUCCESS).setData(users);
    }

    /**
     * 条件查询 LowCodeUrl
     *
     * @param findLowCodeUrlParams 查询条件
     * @return ReturnResult<Object>
     */
    @Override
    public ReturnResult<Object> getLowCodeUrl(FindLowCodeUrlParams findLowCodeUrlParams) {
        Query query = new Query();
        if (StringUtils.hasLength(findLowCodeUrlParams.getSystemName())) {
            // regex 模糊查询
            query.addCriteria(Criteria.where("systemName").regex(findLowCodeUrlParams.getSystemName()));
        }
        if (StringUtils.hasLength(findLowCodeUrlParams.getObjectName())) {
            // regex 模糊查询
            query.addCriteria(Criteria.where("objectName").regex(findLowCodeUrlParams.getObjectName()));
        }
        if (StringUtils.hasLength(findLowCodeUrlParams.getInterfaceType())) {
            query.addCriteria(Criteria.where("interfaceType").is(findLowCodeUrlParams.getInterfaceType()));
        }
        List<LowCodeUrl> lowCodeUrlList = mongoTemplateLowCode.find(query, LowCodeUrl.class);
        return ReturnResult.build(Result.QUERY_SUCCESS).setData(lowCodeUrlList);
    }

    /**
     * 新增 LowCodeUrl 数据
     *
     * @param lowCodeUrlParams LowCodeUrl 数据
     * @return ReturnResult<Object>
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ReturnResult<Object> addLowCodeUrl(AddLowCodeUrlParams lowCodeUrlParams) {
        Date date = new Date();
        LowCodeUrl codeUrl = new LowCodeUrl();
        codeUrl.setSystemName(lowCodeUrlParams.getSystemName());
        codeUrl.setObjectName(lowCodeUrlParams.getObjectName());
        codeUrl.setInterfaceUrl(lowCodeUrlParams.getInterfaceUrl());
        codeUrl.setInterfaceType(lowCodeUrlParams.getInterfaceType());
        codeUrl.setCreateTime(date);
        codeUrl.setUpdateTime(date);
        LowCodeUrl insert = mongoTemplateLowCode.insert(codeUrl);
        return ReturnResult.build(Result.ADD_SUCCESS).setData(insert.getId());
    }

    /**
     * 新增 event 数据
     *
     * @param eventParams LowCodeUrl 数据
     * @return ReturnResult<Object>
     */
    @Override
    public ReturnResult<Object> addEvent(AddEventParams eventParams) {
        Date date = new Date();
        Event event = new Event();
        event.setEventName(eventParams.getEventName());
        event.setEventType(eventParams.getEventType());
        event.setTriggerMode(eventParams.getTriggerMode());
        event.setCreateTime(date);
        event.setUpdateTime(date);
        Event insert = mongoTemplateEvent.insert(event);
        return ReturnResult.build(Result.ADD_SUCCESS).setData(insert.getId());
    }

    /**
     * 分页查询 event 数据
     *
     * @param eventParams 查询条件
     * @return ReturnResult<Object>
     */
    @Override
    public ReturnResult<Object> pageEvent(PageEventParams eventParams) {
        // 排序字段
        Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
        // 分页,PageNumber()-1是因为第一页的下标为0 ,入参PageNumber最小值为1
        Pageable pageRequest = PageRequest.of(eventParams.getPageNumber()-1, eventParams.getPageSize(), sort);
        // 查询条件
        Query query = new Query();
        if (StringUtils.hasLength(eventParams.getEventName())) {
            // regex 模糊查询
            query.addCriteria(Criteria.where("eventName").regex(eventParams.getEventName()));
        }
        if (StringUtils.hasLength(eventParams.getEventType())) {
            // regex 模糊查询
            query.addCriteria(Criteria.where("eventType").regex(eventParams.getEventType()));
        }
        if (StringUtils.hasLength(eventParams.getTriggerMode())) {
            // regex 模糊查询
            query.addCriteria(Criteria.where("triggerMode").regex(eventParams.getTriggerMode()));
        }
        query.with(pageRequest);
        // 查询总数
        long count = mongoTemplateEvent.count(query, Event.class);
        // 查询数据
        List<Event> events = mongoTemplateEvent.find(query, Event.class);
        // 分页结果
        PageResult<List<Event>> result = new PageResult<>();
        result.setPageNumber(eventParams.getPageNumber());
        result.setPageSize(eventParams.getPageSize());
        result.setTotalRow(count);
        result.setRecords(events);
        return ReturnResult.build(Result.QUERY_SUCCESS).setData(result);
    }
}

8.源码地址

https://gitee.com/xhs101/spring-boot-demo

9.查询效果:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)

摘要 由于要求较高的时效性和劳力投入&#xff0c;果实采摘环节成为苹果生产作业中十分重要的一部分。而对于自然环境下生长的苹果&#xff0c;光照影响、枝叶遮挡和果实重叠等情况普遍存在&#xff0c;这严重影响了果实的准确识别以及采摘点的精确定位。针对在复杂背景下苹果的…

android 保活的一种有效的方法

android 保活的一种有效的方法 为什么要保活 说起程序的保活,其实很多人都觉得,要在手机上进行保活,确实是想做一些小动作,其实有些正常的场景也是需要我们进行保活的,这样可以增强我们的用户体验。保活就是使得程序常驻内存,这种程序不容易被杀,或者在被杀以后还能完…

kubernetes使用nfs创建pvc部署mysql stateful的方法

kubernetes创建的pod默认都是无状态的&#xff0c;换句话说删除以后不会保留任何数据。 所以对于mysql这种有状态的应用&#xff0c;必须使用持久化存储作为支撑&#xff0c;才能部署成有状态的stateful. 最简单的方法就是使用nfs作为网络存储&#xff0c;因为nfs存储很容易被…

css Vue尺子样式

原生css生成尺子样式 <template><div class"page"><div class"Light"></div><div class"rile"><ul id"list"><!--尺子需要几个单位就加几个--><li></li><li></li&…

css三角,鼠标样式,溢出文字

目录 css三角 鼠标样式 例子&#xff1a;页码模块 溢出文字表示方式 margin负值运用 css三角强化 css三角 css三角中&#xff1a;line-height&#xff1a;0和font-size&#xff1a;0是防止兼容性的问题 jd {position: relative;width: 120px;height: 249px;background-…

数据库基础知识小结

数据库基础知识小结 什么是数据库&#xff0c;数据库管理员&#xff0c;数据库管理员&#xff0c;数据库系统&#xff1f; 数据库: 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。 数据库管理系统: 数据库管理系统(DataBase Mana…

Oracle SQL 注入上的 Django GIS 函数和聚合漏洞 (CVE-2020-9402)

漏洞描述 Django 于2020年3 月4日发布了一个安全更新&#xff0c;修复了 GIS 函数和聚合中的 SQL 注入漏洞。 参考链接&#xff1a; Django security releases issued: 3.0.4, 2.2.11, and 1.11.29 | Weblog | Django 该漏洞要求开发者使用 JSONField/HStoreField;此外&…

【matlab程序】图像最大化填充画布

【matlab程序】图像最大化填充画布 不做任何修饰&#xff1a; 修饰&#xff1a; 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Pytho…

flutter之graphic图表自定义tooltip

renderer graphic中tooltip的TooltipGuide类提供了renderer方法&#xff0c;接收三个参数Size类型&#xff0c;Offset类型&#xff0c;Map<int, Tuple>类型。可查到的文档是真的少&#xff0c;所以只能在源码中扒拉例子&#xff0c;做符合需求的修改。 官方github示例 …

在 Python 的 requests 二进制数据的传输方式发生了变化

在Python编程中&#xff0c;requests库是一个非常有用的工具&#xff0c;用于发送HTTP请求。由于其简单易用的API和广泛的兼容性&#xff0c;requests库已经成为Python开发者中最常用的网络请求库之一。 然而&#xff0c;最近在requests 0.10.1版本中&#xff0c;POST二进制数据…

力扣学习笔记——239. 滑动窗口最大值

力扣学习笔记——239. 滑动窗口最大值 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输…

php高级工程师范文模板

以下简历内容以php高级工程师招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴&#xff0c;希望能帮助大家在众多候选人中脱颖而出。 php高级工程师简历在线制作下载&#xff1a;百度幻主简历 求职意向 求职类型&…

带submodule的git仓库自动化一键git push、git pull脚本

前言 很久没写博客了&#xff0c;今天难得闲下来写一次。 不知道大家在使用git的时候有没有遇到过这样的问题&#xff1a;发现git submodule特别好用&#xff0c;适合用于满足同时开发和部署的需求&#xff0c;并且结构清晰&#xff0c;方便我们对整个代码层次有一个大概的了…

[Docker]十.Docker Swarm讲解

一.Dokcer Swarm集群介绍 1.Dokcer Swarm 简介 Docker Swarm 是 Docker 公司推出的用来管理 docker 集群的工具&#xff0c; 使用 Docker Swarm 可以快速方便的实现 高可用集群 ,Docker Compose 只能编排单节点上的容器, Docker Swarm 可以让我们在单一主机上操作来完成对 整…

万字解析设计模式之模板方法与解释器模式

一、模板方法模式 1.1概述 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 例如&#xff0c;去银行办理业务一般要经过以下4个流程&#xff1a;取号、排队、办理具体业…

分布式数据恢复-hbase+hive分布式存储误删除如何恢复数据?

hbasehive分布式存储数据恢复环境&#xff1a; 16台某品牌R730XD服务器节点&#xff0c;每台物理服务器节点上有数台虚拟机&#xff0c;虚拟机上配置的分布式&#xff0c;上层部署hbase数据库hive数据仓库。 hbasehive分布式存储故障&初检&#xff1a; 数据库文件被误删除…

RPCS3(PlayStation 3游戏模拟器)汉化教程

RPCS3 RPCS3 是一款PlayStation 3 模拟器&#xff0c;可让 Windows、Linux 或 BSD 系统的用户运行索尼 PlayStation 3 游戏。 安装教程 包含 Windows/Linux版本 详细安装汉化教程请查看文章 RPCS3&#xff08;PS3模拟器&#xff09;安装及汉化教程 1.首先下载最新版 RPCS3模…

智能汽车的山海之盾

最近一段时间&#xff0c;关于汽车数字化、智能化进程中的安全问题引发了一系列行业讨论。这个话题也得到了行业更广泛的认识与关注。 汽车智能化是大势所趋&#xff0c;而智能化带来了复杂的系统架构与多样化的功能模块&#xff0c;势必会加大安全隐患&#xff0c;但汽车本身又…

npm WARN npm npm does not support Node.js v13.9.0

Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v v13.9.0C:\Users\Administrator>npm -v npm WARN npm npm does not support Node.js v13.9.0 npm WARN npm You should probably upgrade to a newe…

LeetCode Hot100 101.对称二叉树

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 代码&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {if(rootnull || (root.leftnull && root.rightnull)) {return true;}//用队列保存节点LinkedList<…