SpriingBoot整合MongoDB多数据源

背景:

MongoDB多数据源:springboot为3以上版本,spring-boot-starter-data-mongodb低版本MongoDBFactory已过时,
改为MongoDatabaseFactory。

1、pom引入:

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

在这里插入图片描述
2、结构:

在这里插入图片描述
3、连接配置

spring:data:mongodb:primary:uri: mongodb://admin:admin!8@192.168.10.112:27017/kuname?authSource=admin&readPreference=primary&appname=MongoDB Compass Community&ssl=false

4、具体内容

package com.hh.framework.config;import com.hh.framework.page.MongoPageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoConverter;/*** @Description:mongo监听 新增时消除默认添加的 _class 字段保存实体类类型**/
@Configuration
public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {@Autowired@Qualifier("primaryMongo")MongoTemplate primaryMongoTemplate;/*@Autowired@Qualifier("secondaryMongo")MongoTemplate secondaryMongoTemplate;
*/private static final String TYPEKEY = "_class";@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {MongoConverter converter = primaryMongoTemplate.getConverter();if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));}/* MongoConverter converter2 = secondaryMongoTemplate.getConverter();if (converter2.getTypeMapper().isTypeKey(TYPEKEY)) {((MappingMongoConverter) converter2).setTypeMapper(new DefaultMongoTypeMapper(null));}*/}@Beanpublic MongoPageHelper mongoPageHelper() {return new MongoPageHelper(primaryMongoTemplate);}}
package com.hh.framework.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;@Configuration
public class MongoDbConfig {@AutowiredMongoDatabaseFactory mongoDatabaseFactory;public @Bean MongoTemplate mongoTemplate() throws Exception {//remove _class(insert数据时,mongodb默认生成_class字段)MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDatabaseFactory), new MongoMappingContext());converter.setTypeMapper(new DefaultMongoTypeMapper(null));return new MongoTemplate(mongoDatabaseFactory, converter);}}
package com.hh.framework.config;import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;/*** @Description:mongo连接配置类**/
@Configuration
public class MongoInit {@Bean(name = "primaryMongoProperties")@Primary@ConfigurationProperties(prefix = "spring.data.mongodb.primary")public MongoProperties statisMongoProperties() {System.out.println("-------------------- primaryMongoProperties init ---------------------");return new MongoProperties();}/* @Bean(name = "secondaryMongoProperties")@ConfigurationProperties(prefix = "spring.data.mongodb.secondary")public MongoProperties twoMongoProperties() {System.out.println("-------------------- secondaryMongoProperties init ---------------------");return new MongoProperties();}*/}
package com.hh.framework.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;/*** @Description:monngo第一个数据源:primary**/
@Slf4j
@Configuration
//jar中含有此类,但此处引入冒红,不影响使用
@EnableMongoRepositories( basePackages = "com.hh.framework.entity.primary",mongoTemplateRef = "primary")
public class PrimaryMongoTemplate {@Autowired@Qualifier("primaryMongoProperties")private MongoProperties primaryMongoProperties;@Primary@Bean(name = "primaryMongo") //第一个数据源名字oneMongopublic MongoTemplate primaryMongoTemplate() {try {log.info("primaryMongoProperties:" + primaryMongoProperties.getUri());return new MongoTemplate(mongoDatabaseFactory(primaryMongoProperties));} catch (Exception e) {e.printStackTrace();}return null;}@Bean@Primarypublic MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());}}
package com.hh.framework.config;/*import com.mongodb.MongoClientURI;*/
/*import org.springframework.data.mongodb.core.SimpleMongoDbFactory;*/
/*
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
*//*** @Description: mongo第二个数据源:secondary**/
/*
@Configuration
@EnableMongoRepositories(basePackages = "com.hh.framework.entity.secondary",mongoTemplateRef = "secondary")*/
public class SecondaryMongoTemplate {/*@Autowired@Qualifier("secondaryMongoProperties")private MongoProperties secondaryMongoProperties;@Primary@Bean(name = "secondaryMongo") //第二个数据源名字public MongoTemplate primaryMongoTemplate() {try {log.info("secondaryMongoProperties:" + secondaryMongoProperties.getUri());return new MongoTemplate(mongoDatabaseFactory(secondaryMongoProperties));} catch (Exception e) {e.printStackTrace();}return null;}@Bean@Primarypublic MongoDatabaseFactory mongoDatabaseFactory(MongoProperties mongoProperties) {return new SimpleMongoClientDatabaseFactory(mongoProperties.getUri());}*/
}
package com.hh.framework.entity.primary;import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.Date;@Document(collection = "t_city")
@Data
public class CityEntity {private String id;private String code;private String name;
}

5、以下为工具类:

package com.hh.framework.page;import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
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.Component;import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;/*** MongoDB分页查询工具类.**/
@Component
public class MongoPageHelper {public static final int FIRST_PAGE_NUM = 1;public static final String ID = "_id";private final MongoTemplate mongoTemplate;@Autowiredpublic MongoPageHelper(MongoTemplate mongoTemplate) {this.mongoTemplate = mongoTemplate;}/*** 分页查询,直接返回集合类型的结果.** @see MongoPageHelper#pageQuery(Query,* Class, Function, Integer, Integer,* String)*/public <T> MongoPageResult<T> pageQuery(Query query, Class<T> entityClass, Integer pageSize,Integer pageNum) {return pageQuery(query, entityClass, Function.identity(), pageSize, pageNum, null);}/*** 分页查询,不考虑条件分页,直接使用skip-limit来分页.** @see MongoPageHelper#pageQuery(Query,* Class, Function, Integer, Integer,* String)*/public <T, R> MongoPageResult<R> pageQuery(Query query, Class<T> entityClass, Function<T, R> mapper,Integer pageSize, Integer pageNum) {return pageQuery(query, entityClass, mapper, pageSize, pageNum, null);}/*** 分页查询.** @param query Mongo Query对象,构造你自己的查询条件.* @param entityClass Mongo collection定义的entity class,用来确定查询哪个集合.* @param mapper 映射器,你从db查出来的list的元素类型是entityClass, 如果你想要转换成另一个对象,比如去掉敏感字段等,可以使用mapper来决定如何转换.* @param pageSize 分页的大小.* @param pageNum 当前页.* @param lastId 条件分页参数, 区别于skip-limit,采用find(_id>lastId).limit分页.* 如果不跳页,像朋友圈,微博这样下拉刷新的分页需求,需要传递上一页的最后一条记录的ObjectId。 如果是null,则返回pageNum那一页.* @param <T> collection定义的class类型.* @param <R> 最终返回时,展现给页面时的一条记录的类型。* @return PageResult,一个封装page信息的对象.*/public <T, R> MongoPageResult<R> pageQuery(Query query, Class<T> entityClass, Function<T, R> mapper,Integer pageSize, Integer pageNum, String lastId) {//分页逻辑long total = mongoTemplate.count(query, entityClass);final Integer pages = (int) Math.ceil(total / (double) pageSize);if (pageNum <= 0 || pageNum > pages) {pageNum = FIRST_PAGE_NUM;}final Criteria criteria = new Criteria();if (StringUtils.isNotBlank(lastId)) {if (pageNum != FIRST_PAGE_NUM) {criteria.and(ID).gt(new ObjectId(lastId));}query.limit(pageSize);} else {int skip = pageSize * (pageNum - 1);query.skip(skip).limit(pageSize);}final List<T> entityList = mongoTemplate.find(query.addCriteria(criteria).with(Sort.by(Lists.newArrayList(new Order(Direction.ASC, ID)))),entityClass);final MongoPageResult<R> pageResult = new MongoPageResult<>();pageResult.setTotal(total);pageResult.setPages(pages);pageResult.setPageSize(pageSize);pageResult.setPageNum(pageNum);pageResult.setList(entityList.stream().map(mapper).collect(Collectors.toList()));return pageResult;}}
package com.hh.framework.page;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** 分页结果.*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(Include.NON_NULL)
public class MongoPageResult<T> {@Schema(description = "页码,从1开始")private Integer pageNum;@Schema(description = "页面大小")private Integer pageSize;@Schema(description = "总数")private Long total;@Schema(description = "总页数")private Integer pages;@Schema(description = "数据")private List<T> list;}
package com.hh.framework.page;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** 分页结果.*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(Include.NON_NULL)
public class MongoPageResult<T> {@Schema(description = "页码,从1开始")private Integer pageNum;@Schema(description = "页面大小")private Integer pageSize;@Schema(description = "总数")private Long total;@Schema(description = "总页数")private Integer pages;@Schema(description = "数据")private List<T> list;}

6、业务模块使用:service层

@Autowired@Qualifier("primaryMongo")private MongoTemplate primaryMongoTemplate;@Overridepublic List getList() {Criteria criteria = Criteria.where("id").in().and("code").gte("").lte("");Query query = Query.query(criteria).with(Sort.by(Sort.Direction.DESC,"code"));return primaryMongoTemplate.find(query, CityEntity.class);}

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

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

相关文章

汇编基础----mov基本操作

汇编基础----mov基本操作 下载VS2022 这个网上教程很多,自行下载安装即可 新建项目 选择空项目,如何点击下一步 在源文件下创建这二个文件 修改配置使asm文件能被解析,右击项目名(demo)->生成依赖项->生成自定义->勾选如下图所示选项->确定 立即数寻址 main…

qt环境搭建-镜像源安装Qt Creator(5.15.2)以及配置环境变量

前言&#xff1a; 版本&#xff1a;5.15.2 镜像源&#xff1a;ustc与清华 纯小白&#xff0c;找了半天的镜像源安装qtcreator&#xff0c;搞了半天结果安装的是最新的&#xff0c;太新的对小白很不友好&#xff0c;bug比较多&#xff0c;支持的系统也不全&#xff0c;口碑不…

【SCI绘图】【小提琴系列1 python】绘制按分类变量分组的垂直小提琴图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【小提琴系列1 python】绘制按分类变量分组的垂直小提琴图&#xff0c;文末附完整代码 小提琴图是一种常用的数据可视化工具…

鸿蒙原生应用已超4000个!

鸿蒙原生应用已超4000个&#xff01; 来自 HarmonyOS 微博近期消息&#xff0c;#鸿蒙千帆起# 重大里程碑&#xff01;目前已有超4000个应用加入鸿蒙生态。从今年1月18日华为宣布首批200多家应用厂商正在加速开发鸿蒙原生应用&#xff0c;到3月底超4000个应用&#xff0c;短短…

约跑小程序源码(asp.net+vue+element++uniapp+sqlserver)

开发语言&#xff1a;c# 框架&#xff1a;后端 asp.net mvc pc管理页面&#xff1a;vueelement 数据库&#xff1a;sqlserver 开发软件&#xff1a;eclipse/myeclipse/idea 浏览器&#xff1a;谷歌浏览器 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X …

PyCharm关闭项目后等待时间长

每次关闭项目或PyCharm时&#xff0c;会显示正在关闭项目&#xff0c;而这个关闭时间很长且不可确定&#xff0c;很浪费我们的时间&#xff0c;不过愿意等的话&#xff0c;倒也是可以。 解决方法 Help -> Find Action -> 查找 Registry -> 禁用 ide.await.scope.comp…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了&#xff0c;出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

【QT+QGIS跨平台编译】076:【libdxfrw跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libdxfrw介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、libdxfrw介绍 libdxfrw是一个用于读取和写入DXF(Drawing Exchange Format)文件的开源C++库。DXF是一种由AutoCAD开发的文件格式,用于存储CAD(计算机辅助设计)图形数据,它…

【大数据】安装hive-3.1.2

1、上传HIVE包到/opt/software目录并解压到/opt/modules/ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/modules/ 2、修改路径 mv /opt/modules/apache-hive-3.1.2-bin/ /opt/modules/hive 3、将hIVE下的bin目录加入到/etc/profile中 export HIVE_HOME/opt/module…

3d怎么在一块模型上开个孔---模大狮模型网

在进行3D建模时&#xff0c;有时候需要在模型上创建孔&#xff0c;以实现特定的设计需求或功能。无论是为了添加细节&#xff0c;还是为了实现功能性的要求&#xff0c;创建孔都是常见的操作之一。本文将介绍在3D模型上创建孔的几种常用方法&#xff0c;帮助您轻松实现这一目标…

pytorch 演示 tensor并行

pytorch 演示 tensor并行 一.原理二.实现代码 本文演示了tensor并行的原理。如何将二个mlp切分到多张GPU上分别计算自己的分块,最后做一次reduce。 1.为了避免中间数据产生集合通信,A矩阵只能列切分,只计算全部batch*seqlen的部分feature 2.因为上面的步骤每张GPU只有部分featu…

2024 Tuxera NTFS for Mac功能介绍及如何安装使用

随着科技的发展&#xff0c;我们的日常生活和工作越来越依赖于电子设备。而在这些设备中&#xff0c;Mac由于其出色的稳定性和易用性&#xff0c;成为了许多用户的首选。然而&#xff0c;尽管Mac自带的文件系统已经足够强大&#xff0c;但仍有一些用户希望获得更加高效、稳定的…

【氮化镓】在轨实验研究辐射对GaN器件的影响

【Pioneering evaluation of GaN transistors in geostationary satellites】 摘要&#xff1a; 这篇论文介绍了一项为期6年的空间实验结果&#xff0c;该实验研究了在地球静止轨道上辐射对氮化镓&#xff08;GaN&#xff09;电子元件的影响。实验使用了四个GaN晶体管&#xf…

如何水出第一篇SCI:SCI发刊历程,从0到1全过程经验分享!!!

如何水出第一篇SCI&#xff1a;SCI发刊历程&#xff0c;从0到1全路程经验分享&#xff01;&#xff01;&#xff01; 详细的改进教程以及源码&#xff0c;戳这&#xff01;戳这&#xff01;&#xff01;戳这&#xff01;&#xff01;&#xff01;B站&#xff1a;Ai学术叫叫兽e…

WPS解决插入公式在正文带来行间距变大问题

问题描述 写论文解释公式时&#xff0c;插入对应的变量&#xff0c;导致行间距变大&#xff0c;如图 显然上文与下文行间距不等。但无法通过修改数值修改下文行间距。 解决办法

消息队列之RabbitMQ的安装配置

一&#xff0c;前言 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息队列在分布式系统开发中应用非常广泛。点击跳转RabbitM…

90天玩转Python—05—基础知识篇:Python基础知识扫盲,使用方法与注意事项

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

SSM整合----第一个SSM项目

文章目录 前言一、使用步骤1.引入库2.建表3 项目结构4 web.xml的配置5 配置数据源6 SpringMVC配置7 配置MyBatis Mapper8 书写控制类 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; SSM整合是指Spring、SpringMVC和MyBatis这三个框架的整合使用。…

MTK i500p AIoT解决方案

一、方案概述 i500p是一款强大而高效的AIoT平台&#xff0c;专为便携式、家用或商用物联网应用而设计&#xff0c;这些应用通常需要大量的边缘计算&#xff0c;需要强大的多媒体功能和多任务操作系统。该平台集成了Arm Cortex-A73 和 Cortex-A53 的四核集群&#xff0c;工作频…