【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