当前位置: 首页 > news >正文

springboot 简单配置mongodb多数据源

准备工作:

  1. 本地mongodb一个
  2. 创建两个数据库 student 和 student-two

所需jar包:

# springboot基于的版本
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/>
</parent># maven 关键jar包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

配置文件:

# uri 配置样例: mongodb://myDBReader:D1fficultP%40ssw0rd@mongodb0.example.com:27017/admin 
# 如果用户名或密码包含at符号@,冒号:,斜杠/或百分号%字符,请使用百分比编码方式消除歧义
# uri 集群配置样例: mongodb://myDBReader:D1fficultP%40ssw0rd@mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/admin?replicaSet=myRepl
douzi:mongo:primary:uri: mongodb://127.0.0.1:27017/studentrepository-package: com.douzi.mongo.dao.primarysecondary:uri: mongodb://127.0.0.1:27017/student-tworepository-package: com.douzi.mongo.dao.secondary

多数据源配置类 MultipleMongoConfig:

package com.douzi.mongo.config;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.util.StringUtils;import com.mongodb.MongoClientURI;/*** @Author douzi* @Title: MultipleMongoConfig* @Description: 读取对应的配置信息并且构造对应的MongoTemplate* @Date 2023-09-27*/
@Configuration
public class MultipleMongoConfig {@Value("${douzi.mongo.primary.uri}")private String primaryUri;@Value("${douzi.mongo.secondary.uri}")private String secondaryUri;/*** 配置主数据源template* @return 主数据源template*/@Primary@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)public MongoTemplate primaryMongoTemplate() {return new MongoTemplate(primaryFactory());}/*** 配置从数据源template* @return 从数据源template*/@Bean@Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)public MongoTemplate secondaryMongoTemplate() {return new MongoTemplate(secondaryFactory());}/*** 配置主数据源db工厂* @param mongo 属性配置信息* @return 主数据源db工厂*/@Bean@Primarypublic MongoDbFactory primaryFactory() {if (StringUtils.isEmpty(primaryUri)) {throw new RuntimeException("必须配置mongo primary Uri");}return new SimpleMongoDbFactory(new MongoClientURI(primaryUri));}/*** 配置从数据源db工厂* @param mongo 属性配置信息* @return 从数据源db工厂*/@Beanpublic MongoDbFactory secondaryFactory() {return new SimpleMongoDbFactory(new MongoClientURI(secondaryUri));}
}

 主数据源配置 PrimaryMongoConfig:

package com.douzi.mongo.config;import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;/*** @Author douzi* @Title: PrimaryMongoConfig* @Description: 主数据源配置* @date 2023-09-27 */
@Configuration
@EnableMongoRepositories(basePackages = "${douzi.mongo.primary.repository-package}", mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
public class PrimaryMongoConfig {protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
}

副数据源配置 SecondaryMongoConfig:

package com.douzi.mongo.config;import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;/*** @Author douzi* @Title: SecondaryMongoConfig* @Description: 从数据源配置* @Date 2023-09-27*/
@Configuration
@EnableMongoRepositories(basePackages = "${douzi.mongo.secondary.repository-package}", mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
public class SecondaryMongoConfig {protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
}

以下是辅助测试类 高手可以自行测试:

dao层:

package com.douzi.mongo.dao.primary;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;/*** @Author douzi* @Title: PrimaryStudent* @Description: 主数据源学生对象* @Date 2023/09/24 13:33*/
@Data
@Document(collection = "first_students")
public class PrimaryStudent implements Serializable {/*** id*/@Idprivate Integer id;/*** 姓名*/private String name;/*** 生活费*/private BigDecimal salary;/*** 生日*/private Date birth;}##################################分隔符########################################package com.douzi.mongo.dao.primary;import org.springframework.data.mongodb.repository.MongoRepository;/*** @Author douzi* @Title: PrimaryRepository* @Description: 主数据源dao层* @Date 2023/09/24 16:01*/
public interface PrimaryRepository extends MongoRepository<PrimaryStudent, Integer> {/*** 通过名字查找学生** @param name 名字* @return 学生信息*/PrimaryStudent findByName(String name);/*** 通过名字删除学生** @param name 名字* @return 学生信息*/PrimaryStudent removeStudentByName(String name);
}##################################分隔符########################################package com.douzi.mongo.dao.secondary;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;/*** * @Author douzi* @Title: PrimaryStudent* @Description: 副数据源学生对象* @Date 2023/09/24 13:33*/
@Data
@Document(collection = "secondary_students")
public class SecondaryStudent implements Serializable {/*** id*/@Idprivate Integer id;/*** 姓名*/private String name;/*** 生活费*/private BigDecimal salary;/*** 生日*/private Date birth;}##################################分隔符########################################package com.douzi.mongo.dao.secondary;import org.springframework.data.mongodb.repository.MongoRepository;/*** @Author douzi* @Title: SecondaryRepository* @Description: 从数据源dao层* @Date 2023/09/24 16:02*/
public interface SecondaryRepository extends MongoRepository<SecondaryStudent, Integer> {/*** 通过名字查找学生** @param name 名字* @return 学生信息*/SecondaryStudent findByName(String name);/*** 通过名字删除学生** @param name 名字* @return 学生信息*/SecondaryStudent removeStudentByName(String name);
}

Service层:

package com.douzi.mongo.service;import com.douzi.mongo.dao.primary.PrimaryRepository;
import com.douzi.mongo.dao.primary.PrimaryStudent;
import com.douzi.mongo.dao.secondary.SecondaryRepository;
import com.douzi.mongo.dao.secondary.SecondaryStudent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** * @Author douzi* @Title: StudentService* @Description: * @Date 2023/09/24 14:32*/
@Service
@Slf4j
public class StudentService {@Autowiredprivate PrimaryRepository primaryRepository;@Autowiredprivate SecondaryRepository secondaryRepository;/*** 保存学生** @param primaryStudent* @param secondaryStudent*/public void save(PrimaryStudent primaryStudent, SecondaryStudent secondaryStudent) {PrimaryStudent student1 = primaryRepository.insert(primaryStudent);log.info(student1.toString());SecondaryStudent student2 = secondaryRepository.insert(secondaryStudent);log.info(student2.toString());}/*** 删除学生** @param name* @return*/public void delete(String name) {primaryRepository.deleteById(1);secondaryRepository.deleteById(1);}/*** 修改学生** @param primaryStudent* @param secondaryStudent*/public void update(PrimaryStudent primaryStudent, SecondaryStudent secondaryStudent) {PrimaryStudent student1 = primaryRepository.save(primaryStudent);log.info(student1.toString());SecondaryStudent student2 = secondaryRepository.save(secondaryStudent);log.info(student2.toString());}/*** 查找学生** @param name 学生姓名* @return*/public void find(String name) {PrimaryStudent student1 = primaryRepository.findByName(name);log.info(student1.toString());SecondaryStudent student2 = secondaryRepository.findByName(name);log.info(student2.toString());}/*** 查找学生集合** @return 学生集合*/public void findAll() {List<PrimaryStudent> primaryRepositoryAll = primaryRepository.findAll();log.info(primaryRepositoryAll.toString());List<SecondaryStudent> secondaryRepositoryAll = secondaryRepository.findAll();log.info(secondaryRepositoryAll.toString());}
}

Controller层:

package com.douzi.mongo.controller;import com.douzi.mongo.dao.primary.PrimaryStudent;
import com.douzi.mongo.dao.secondary.SecondaryStudent;
import com.douzi.mongo.service.StudentService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.util.Date;/*** @Author douzi* @Title: StudentController* @Description: * @Date 2023/09/24 14:53*/
@RestController
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;/*** 保存学生** @return 保存的学生*/@RequestMapping("/save")public void save() {PrimaryStudent primaryStudent = new PrimaryStudent();SecondaryStudent secondaryStudent = new SecondaryStudent();primaryStudent.setId(1);primaryStudent.setName("mongo");primaryStudent.setSalary(BigDecimal.valueOf(1000));primaryStudent.setBirth(new Date());BeanUtils.copyProperties(primaryStudent, secondaryStudent);studentService.save(primaryStudent, secondaryStudent);}/*** 修改学生** @return 修改结果*/@RequestMapping("/update")public void update() {PrimaryStudent primaryStudent = new PrimaryStudent();SecondaryStudent secondaryStudent = new SecondaryStudent();primaryStudent.setId(1);primaryStudent.setName("mongo");primaryStudent.setSalary(BigDecimal.valueOf(2000));primaryStudent.setBirth(new Date());BeanUtils.copyProperties(primaryStudent, secondaryStudent);studentService.update(primaryStudent, secondaryStudent);}/*** 根据姓名删除学生** @param name 姓名* @return 删除结果*/@RequestMapping("/delete")public void delete(String name) {studentService.delete(name);}/*** 通过名字查找学生** @param name 学生名* @return 学生信息*/@RequestMapping("/find")public void find(String name) {studentService.find(name);}/*** 查找所有学生** @return 学生集合*/@RequestMapping("/all")public void findAll() {studentService.findAll();}}

测试:

http://localhost:8080/student/save

结果:

相关文章:

springboot 简单配置mongodb多数据源

准备工作&#xff1a; 本地mongodb一个创建两个数据库 student 和 student-two 所需jar包&#xff1a; # springboot基于的版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…...

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例 准备条件: PLC:S7-1200 1214C DC/DC/DC 系统版本4.5及以上。 机器人控制柜:安川YRC1000。 软件:TIA V17 PLC做主站,机器人做从站。 具体方法可参考以下内容: 使用的库文件为西门子 1200系列…...

pytorch第一天(tensor数据和csv数据的预处理)lm老师版

tensor数据&#xff1a; import torch import numpyx torch.arange(12) print(x) print(x.shape) print(x.numel())X x.reshape(3, 4) print(X)zeros torch.zeros((2, 3, 4)) print(zeros)ones torch.ones((2,3,4)) print(ones)randon torch.randn(3,4) print(randon)a …...

CSP-J第二轮试题-2021年-1.2题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 分糖果题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案1答案2-优化 [CSP-J 2021] 插入排序题目描述输入格式输出格式样例 #1样例输入 #1样…...

怒刷LeetCode的第16天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;迭代 方法二&#xff1a;模拟 方法三&#xff1a;循环模拟 方法四&#xff1a;传递 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯 方法二&#xff1a;枚举优化 第三题 题目来源 题目…...

让大脑自由

前言 作者写这本书的目的是什么&#xff1f; 教会我们如何让大脑更好地为自己工作。 1 大脑的运行机制是怎样的&#xff1f; 大脑的基本运行机制是神经元之间通过突触传递信息&#xff0c;神经元的兴奋和抑制状态决定了神经网络的运行和信息处理&#xff0c;神经网络可以通过…...

Arcgis克里金插值报错:ERROR 010079: 无法估算半变异函数。 执行(Kriging)失败。

Arcgis克里金插值报错&#xff1a;ERROR 010079: 无法估算半变异函数。 执行(Kriging)失败。 问题描述&#xff1a; 原因&#xff1a; shape文件的问题&#xff0c;此图可以看出&#xff0c;待插值的点有好几个都超出了地理范围之外&#xff0c;这个不知道是坐标系配准的问…...

Docker Compose安装

title: “Docker Compose安装” createTime: 2022-01-04T19:08:1508:00 updateTime: 2022-01-04T19:08:1508:00 draft: false author: “name” tags: [“docker”,“docker-compose”] categories: [“install”] description: “测试的” docker-compose安装步骤 1.下载 u…...

机器人过程自动化(RPA)入门 7. 处理用户事件和助手机器人

在UiPath中,有两种类型的Robot用于自动化任何流程。一个是后台机器人,它在后台工作。它独立工作,这意味着它不需要用户的输入或任何用户交互。另一个是前台机器人,也被称为助理机器人。 本章介绍前台机器人。在这里,我们将了解自动化过程中通过简单按键、单击鼠标等触发事…...

在linux下预览markdown的方法,转换成html和pdf

背景 markdown是一种便于编写和版本控制的格式&#xff0c;但却不便于预览——特别是包含表格等复杂内容时&#xff0c;单纯的语法高亮是远远不够的——这样就不能边预览边调整内容&#xff0c;需要找到一种预览方法。 思路 linux下有个工具&#xff0c;叫pandoc&#xff0c…...

AIOT入门指南:探索人工智能与物联网的交汇点

AIOT入门指南&#xff1a;探索人工智能与物联网的交汇点 1. 引言 随着技术的快速发展&#xff0c;人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;已经成为当今最热门的技术领域。当这两个领域交汇时&#xff0c;我们得到了AIOT - 一个结合了AI的智能…...

CCC数字钥匙设计【NFC】 --车主配对流程介绍

1、车主配对流程介绍 车主配对流程可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行&#xff0c;本文主要介绍通过NFC进行车主配对的流程。 整个配对流程相对较为复杂&#xff0c;本文主要梳理整体的步骤流程&#xff0c;其中的每个细节流程未…...

一站式开源持续测试平台 MerterSphere 之测试跟踪操作详解

一、MeterSphere平台介绍 MeterSphere是一站式的开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&#xff0c;全面兼容JMeter、Selenium 等主流开源标准&#xff0c;有效助力开发和测试团队充分利用云弹性进…...

自然语言处理状况简介

一、说明 自然语言处理已经进入大模型时代&#xff0c;然而从业人员必须了解整个知识体系、发展过程、知识结构&#xff0c;应用范围等一系列知识。本篇将报道此类概况。 二、自然语言处理简介 自然语言处理&#xff0c;或简称NLP&#xff0c;是处理和转换文本的计算机科学学科…...

python爬虫基于管道持久化存储操作

文章目录 基于管道持久化存储操作scrapy的使用步骤1.先转到想创建工程的目录下&#xff1a;cd ...2.创建一个工程3.创建之后要转到工程目录下4.在spiders子目录中创建一个爬虫文件5.执行工程setting文件中的参数 基于管道持久化存储的步骤&#xff1a;持久化存储1&#xff1a;保…...

【MySQL】数据类型(二)

文章目录 一. char字符串类型二. varchar字符串类型2.1 char和varchar比较 三. 日期和时间类型四. enum和set类型4.1 set的查询 结束语 一. char字符串类型 char (L) 固定长度字符串 L是可以存储的长度&#xff0c;单位是字符&#xff0c;最大长度是255 MySQL中的字符&#xff…...

基于Matlab实现连续模型求解方法

本文介绍了如何使用Matlab实现连续模型求解方法。首先&#xff0c;我们介绍了连续模型的概念&#xff0c;并明确了使用ODE和PDE求解器来求解常微分方程和偏微分方程的步骤。然后&#xff0c;我们通过一个简单的例子演示了如何将问题转化为数学模型&#xff0c;并使用Matlab编写…...

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法&#xff1a; 登陆Tomcat官网&#xff1a;Apache Tomcat - Welcome! 结果&#xff1a;...

iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone

文章目录 一、环境准备1.1、软件环境1.2、硬件环境1.3、查看版本 二、安装WDA过程2.7、构建失败&#xff0c;这类错误有很多&#xff0c;比如在选择开发者账号后&#xff0c;就会提示:Failed to register bundle identifier表示应用唯一注册失败2.9、第二个错误&#xff0c;完全…...

IDEA的Maven换源

前言 IDEA是个好东西&#xff0c;但是使用maven项目时可能会让人很难受&#xff0c;要么是非常慢&#xff0c;要么直接下载不了。所以我们需要给IDEA自带maven换源&#xff0c;保证我们的下载速度。 具体操作 打开IDEA安装路径&#xff0c;然后打开下面的文件夹 plugins\m…...

提升开发效率:用快马一键生成快速排序多版本性能对比工具

今天在优化一个数据处理模块时&#xff0c;遇到了需要选择合适排序算法的问题。不同数据特征下&#xff0c;快速排序的各种变体表现差异很大&#xff0c;手动测试效率实在太低。于是我用InsCode(快马)平台快速搭建了一个性能对比工具&#xff0c;整个过程比想象中简单很多。 需…...

好看不等于会交互!阿里发布基于交互的世界模型基准

视频生成技术正在以惊人的速度迭代&#xff0c;那些光影绚丽的画面常常让人惊叹人工智能的创造力&#xff0c;但当你仔细观察视频中的物理碰撞或物体运动时&#xff0c;会发现它们常常并不符合现实世界的常识。由阿里、中科院、北航和北邮的研究人员联合推出的 Omni-WorldBench…...

技术萨满祭典:给数据中心献祭机械硬盘

一、仪式的缘起&#xff1a;当测试工程师遇见数据之灵在数字文明的殿堂中&#xff0c;数据中心是承载万物之灵的圣地。而软件测试从业者&#xff0c;正是穿梭于代码与硬件之间的现代萨满。当机械硬盘&#xff08;HDD&#xff09;在SSD洪流中逐渐退居幕后&#xff0c;这场为老旧…...

OpenClaw+GLM-4.7-Flash:自动化电子书生成与排版工具

OpenClawGLM-4.7-Flash&#xff1a;自动化电子书生成与排版工具 1. 为什么需要自动化电子书制作 作为一个经常需要整理技术文档的开发者&#xff0c;我过去制作电子书的流程堪称"手工活地狱"&#xff1a;先在多个网页间复制粘贴内容&#xff0c;用Word调整格式&…...

利用快马平台快速构建免费节点测试工具原型,十分钟完成开发

今天想和大家分享一个快速验证免费节点可用性的小工具开发过程。作为一个经常需要测试代理节点的开发者&#xff0c;手动一个个验证实在太费时间&#xff0c;于是我用InsCode(快马)平台快速搭建了一个原型工具&#xff0c;整个过程比想象中简单很多。 需求分析 免费节点测试工具…...

Babel polyfill配置全解析:为什么你的Next.js项目在IE11还是报错?

Babel polyfill配置全解析&#xff1a;为什么你的Next.js项目在IE11还是报错&#xff1f; 在2023年的前端生态中&#xff0c;浏览器兼容性依然是个令人头疼的问题。最近接手一个企业级Next.js项目时&#xff0c;我遇到了一个典型场景&#xff1a;开发环境一切正常&#xff0c;但…...

统信UOS 1060e内网离线安装Docker保姆级教程(附CentOS 8 RPM包下载)

统信UOS 1060e内网离线安装Docker全流程实战指南 在企业级IT基础设施中&#xff0c;内网环境下的软件部署一直是运维工程师面临的特殊挑战。当服务器完全隔离于互联网时&#xff0c;每一个依赖包、每一条配置指令都可能成为阻碍系统正常运行的潜在障碍。本文将深入探讨在统信UO…...

从音乐均衡器到语音降噪:深入浅出玩转数字谐振器设计与MATLAB仿真

从音乐均衡器到语音降噪&#xff1a;深入浅出玩转数字谐振器设计与MATLAB仿真 你是否曾在调整音乐播放器的均衡器时好奇——那些滑动条如何精确控制特定频段的声音强弱&#xff1f;这背后隐藏的数字信号处理魔法&#xff0c;正是我们今天要探索的数字谐振器技术。无论是提取语音…...

别再只调CLIP了!用Qwen2.5-VL的‘鹰之眼’搞定高清文档解析与长视频理解

Qwen2.5-VL&#xff1a;解锁工业级多模态理解的"鹰之眼"技术 在数字化转型浪潮中&#xff0c;企业每天需要处理海量的非结构化数据——从财务报表扫描件到生产线监控视频&#xff0c;从医疗影像到用户生成内容。传统AI模型在处理这些数据时&#xff0c;往往面临两大痛…...

Vue.Draggable深度解析:源码实现与高级应用实战

Vue.Draggable深度解析&#xff1a;源码实现与高级应用实战 【免费下载链接】Vue.Draggable SortableJS/Vue.Draggable: Vue.Draggable 是 Sortable.js 的 Vue.js 封装组件&#xff0c;提供了拖放排序功能&#xff0c;可以在 Vue 应用中轻松实现列表元素的可拖拽重排。 项目地…...