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

【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.238port: 27017username: yapipassword: 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 {@Resourceprivate MongoClient mongoClient;@Resourceprivate MongoProperties mongoProperties;/*** 默认的数据库** @return MongoTemplate*/@Beanpublic MongoTemplate mongoTemplate() {return new MongoTemplate(mongoClient, mongoProperties.getDatabase());}/*** 第二个数据源** @param adminUri uri* @return MongoTemplate*/@Beanpublic MongoTemplate mongoTemplateLowCode(@Value("${spring.data.mongodb.low-code.uri}") String adminUri) {return new MongoTemplate(new SimpleMongoClientDatabaseFactory(adminUri));}/*** 第三个数据源** @param adminUri uri* @return MongoTemplate*/@Beanpublic 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 {@Idprivate 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 {@Idprivate 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 {@Idprivate 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 {@Resourceprivate 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>*/@Overridepublic 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>*/@Overridepublic 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>*/@Overridepublic 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>*/@Overridepublic ReturnResult<Object> pageEvent(PageEventParams eventParams) {// 排序字段Sort sort = Sort.by(Sort.Direction.DESC, "createTime");// 分页,PageNumber()-1是因为第一页的下标为0 ,入参PageNumber最小值为1Pageable 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.mzph.cn/news/175380.shtml

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

相关文章

力扣刷题篇之递归

系列文章目录 目录 系列文章目录 前言 一、二叉树相关问题 二、回溯相关问题 三、动态规划相关问题 总结 前言 刷题按照&#xff1a;[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09;&#xff0c;如图&#xff0c;因为是讲…

A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 如何去掉

在host串口里一直出现打印 A start job is running for Hold unt…s up (1d 18h 52min 25s / no limit) 这个是有一个进程一直在执行中&#xff0c;那么是什么呢&#xff1f;因为我的host通过SSH连接后就可以进入host shell界面了。那这个线程是什么程序导致的呢&#xff1f; …

小程序域名SSL证书的重要性

1. 数据安全 小程序中可能涉及用户的个人信息、支付信息等敏感数据&#xff0c;而未加密的通信容易受到中间人攻击。通过使用SSL证书&#xff0c;所有数据在传输过程中都会被加密&#xff0c;确保用户信息不被窃取或篡改。 2. 用户信任 浏览器和操作系统对使用SSL证书的网站…

索引出错问题。为什么建立了索引,也避免了索引失效问题,还是会出现查询不走索引的情况?

什么建立了索引&#xff0c;也避免了索引失效问题&#xff0c;还是会出现查询不走索引的情况&#xff1f; 其实这个问题在于CBO&#xff08;Cost-based Optimizer&#xff09;&#xff0c;优化器是很强大的&#xff01;他根据开销来决定是否要用索引以及用哪个索引&#xff01;…

Spring-SpringFramework特性以及IOC相关知识

SpringFramework五大模块 特性 IOC思想和DI IOC是容器&#xff0c;用于管理资源 IOC&#xff1a;Inversion of Control 反转控制 DI&#xff1a;Dependecy Injection 依赖注入 组件以预先定义好的方式接受来自容器的资源注入 IOC在Spring中的实现 spring提供两种方式&…

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC视图View

Asp.net web应用程序MVC之View视图 .ASP.NET MVC页面也就是要说的视图基本被放在Views文件夹下&#xff1b; 2.利用APS.NET MVC模板生成框架&#xff0c;Views文件夹下的默认页面为.cshtml页面&#xff1b; 3.ASP.NET MVC默认页面为Razor格式的页面&#xff0c;因此默认页面为.…

NX二次开发UF_CURVE_ask_wrap_curves 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curves Defined in: uf_curve.h int UF_CURVE_ask_wrap_curves(tag_t wrap_curve_object, int * num_output_curves, tag_t * * output_curves ) overview 概述 …

了解静态测试?

静态测试是一种软件测试方法&#xff0c;它主要通过分析软件或代码的静态属性来检查潜在的问题和缺陷&#xff0c;而无需实际执行程序。这种测试方法侧重于检查源代码和其他软件文档&#xff0c;以发现错误并提高软件质量。 为什么要做静态测试&#xff1f; 提前发现和修复错…

[操作系统]京东一面~进程相关汇总

1 进程、线程、协程的概念 进程&#xff1a; 静态程序的运行状态就叫进程。是资源分配的基本单位。 线程&#xff1a; 是进程的一个执行单元&#xff0c;是进程内的调度实体。是CPU调度的独立单位。线程也被称为轻量级进程。 协程&#xff1a; 是一种比线程更加轻量级的存在。…

vue3安装eslint和prettier,最简单的步骤

第1步&#xff1a; 安装eslint yarn add eslint -D 第2步&#xff1a; 在根文件夹中&#xff0c;创建.eslintrc.js文件 第3步&#xff1a; 在package.json文件中新增命令 "lint": "eslint --fix --ext .ts,.tsx,.vue src --quiet","prettier"…

红米手机如何远程控制荣耀手机?

很多人都知道&#xff0c;华为体系有【畅联】&#xff0c;与华为手机或平板“畅连”通话时&#xff0c;可共享屏幕给对方&#xff0c;一边聊天一边演示&#xff0c;还可在屏幕上涂鸦帮助理解。同样&#xff0c;小米体系有【小米通话】&#xff0c;它的远程协助功能可以帮助朋友…

蓝桥杯第100 题 九宫幻方 DFS 全排列 C++ 解题思维

题目 九宫幻方https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&name%E4%B9%9D 思路和解题方法 一 &#xff08;DFS) 首先&#xff0c;定义了一些全局变量和数组。vis数组用于标记已经出现过的数字&#xff0c;a数组用于存储数独的初始状态…

mac上Homebrew的安装与使用

打开终端&#xff1a;command空格 &#xff0c;搜索‘’终端 ’&#xff0c;打开终端 在终端中输入以下命令并按下回车键&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个命令会自动下载并安装…

Ubuntu18.04磁盘取证-中难度篇

涉及的镜像文件&#xff1a; sdb.vhd uac.tar ubuntu.20211208.mem 需要利用的工具&#xff1a; volatility3 volatility2.6.1 FTK/Autopsy Strings 题干 容器是一个Ubuntu Linux 蜜罐&#xff0c;用来观察利用 CVE-2021-41773 的漏洞攻击者想要做什么。 您将看到一个 cr…

【c++】多线程大幅缩减时间

多线程在进行复杂运算时能够大量节约时间 提醒自己能够在多线程运算的时候一定要充分利用 能够省下2/3的时间 测试代码 #include<vector> #include <iostream> #include <thread> using namespace cv; using namespace std; int result1 0 ; bool thread…

【TiDB】TiDB离线方式部署

目录 1 下载TiDB离线组件包 2 安装TiUP 3 合并离线包 4 TIDB 软件和硬件环境建议配置 5 TiDB环境与系统配置检查 6 生成集群初始化配置文件模板 7 执行部署命令 1 检查就能存在的潜在风险 2 手动修复风险 3 部署 TiDB 集群 8 查看TIUP管理的集群情况 9 检查部署的…

【jupyter notebook中插件 nbextensions 安装失败分析与解决方法】

文章目录 问题描述分析与解决总结 问题描述 一开始在安装 notebook 中的插件 nbextensions 时根本没有注意到版本的适配问题&#xff0c;都是进行默认的安装&#xff0c;结果安装是最新版本的 notebook7.x&#xff0c;恰好 notebook7.x 版本不再适应插件 nbextensions&#xf…

使用Arthas排查性能问题

Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类加载信…

Open Feign 源码解析(四) --- 请求对象构造(上)

Open Feign 源码解析四 请求对象的构造&#xff08;上&#xff09; 源码前三篇文章写了这个图的过程 源码前三篇文章的内容归纳起来就是讲了这样的问题&#xff1a; 如何把接口转换为具有发送http请求能力的feign client对象以及如何整合到Spring容器中&#xff1f; 如何构造…

普通表计读数开发思路

一、普通表计类型介绍&#x1f349; 常见的普通表计有SF6&#xff0c;压力表&#xff0c;油位表&#xff08;指针类&#xff09;等。 图1&#xff1a;( 压力表) 图2&#xff1a;&#xff08;油位表-指针类&#xff09; 图3&#xff1a;&#xff08;SF6表&#xff09; 图4:&a…