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

结果:

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

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

相关文章

SSM - Springboot - MyBatis-Plus 全栈体系(十六)

第三章 MyBatis 三、MyBatis 多表映射 2. 对一映射 2.1 需求说明 根据 ID 查询订单&#xff0c;以及订单关联的用户的信息&#xff01; 2.2 OrderMapper 接口 public interface OrderMapper {Order selectOrderWithCustomer(Integer orderId); }2.3 OrderMapper.xml 配置…

一文拿捏基于redis的分布式锁、lua、分布式性能提升

1.分布式锁 jdk的锁&#xff1a; 1、显示锁&#xff1a;Lock 2、隐式锁&#xff1a;synchronized 使用jdk锁保证线程的安全性要求&#xff1a;要求多个线程必须运行在同一个jvm中 但现在的系统基本都是分布式部署的&#xff0c;一个应用会被部署到多台服务器上&#xff0c;s…

【系统架构】软件架构的演化和维护

导读&#xff1a;本文整理关于软件架构的演化和维护知识体系。完整和扎实的系统架构知识体系是作为架构设计的理论支撑&#xff0c;基于大量项目实践经验基础上&#xff0c;不断加深理论体系的理解&#xff0c;从而能够创造新解决系统相关问题。 目录 1、软件架构演化和定义 …

关掉在vscode使用copilot时的提示音

1. 按照图示的操作File --> Preferences --> Settings 2. 搜索框输入关键字Sound&#xff0c;因为是要关掉声音&#xff0c;所以找有关声音的设置 3. 找到如下图所示的选项 Audio Cues:Line Has Inline Suggetion,将其设置为Off 这样&#xff0c;就可以关掉suggest code时…

Python无废话-基础知识字典Dictionary详讲

“字典Dictionary” 是一种无序、可变且可嵌套的数据类型&#xff0c;用于存储键值对。字典使用花括号{}来定义&#xff0c;并用逗号分隔键值对。本文对字典常使用方法&#xff0c;创建字典、添加字典、删除字典、如何获取字典做了知识归纳。 字典有以下几个特征&#xff1a; …

傅里叶系列 P1 的定价选项

如果您想了解更多信息&#xff0c;请查看第 2 部分和第 3 部分。 一、说明 这是第一篇文章&#xff0c;我将帮助您获得如何使用这个新的强大工具来解决金融中的半分析问题并取代您的蒙特卡洛方法的直觉。 我们都知道并喜欢蒙特卡洛数字积分方法&#xff0c;但是如果我告诉你你可…

VS code本地安装PlantUML

VS code本地安装PlantUML 需要条件vs code安装插件使用常见错误 需要条件 在VS Code上安装PlantUML扩展之前&#xff0c;请确保您具有以下先决条件: : Java与GraphViz(点击可直接跳转下载界面); 安装省略 vs code安装插件 vs code安装以下两个插件&#xff08;PlantUML,Grap…

nodejs+vue流浪猫狗救助领养elementui

第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性&#xff1a;技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性&#xff1a; 11 3.3性能分析 11 3.4系统操作流程 12 3.4.1管理员登录流程 12 3.4.2信息添加流程 12 3.4.3信息删除流程 13 第四章 系统设计与…

火热报名中 | 2天峰会、20+热门议题,AutoESG 2023数智低碳---中国汽车碳管理创新峰会亮点抢先看!

在碳中和的背景下&#xff0c;减碳之风吹遍全球&#xff0c;而汽车行业则由于产业链长、辐射面广、碳排放总量增长快、单车碳强度高的特点&#xff0c;成为各国碳排放管理的监管重点&#xff0c;聚焦汽车业的碳博弈也逐步升级。 2020年&#xff0c;国务院办公厅印发的《新能源…

Multiple CORS header ‘Access-Control-Allow-Origin‘ not allowed

今天在修改天天生鲜超市项目的时候&#xff0c;因为使用了前后端分离模式&#xff0c;前端通过网关统一转发请求到后端服务&#xff0c;但是第一次使用就遇到了问题&#xff0c;比如跨域问题&#xff1a; 但是&#xff0c;其实网关里是有配置跨域的&#xff0c;只是忘了把前端项…

下载盗版网站视频并将.ts视频文件合并

. 1.分析视频请求123 2.数据获取和拼接 1.分析视频请求 1 通过抓包观察我们发现视频是由.ts文件拼接成的每一个.ts文件代表一小段2 通过观察0.ts和1.ts的url我们发现他们只有最后一段不同我们网上找到url获取的包3 我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④ 第十九章 驱动程序基石④19.7 工作队列19.7.1 内核函数19.7.1.1 定义 work19.7.1.2 使用 work&#xff1a;schedule_work19.7.1.3 其他函数 19.7.2 编程、上机19.7.3 内部机制19.7.3.1 Linux 2.x的工作队列创建过程19.7.3…

Monkey测试

一&#xff1a;测试环境搭建 1&#xff1a;下载android-sdk_r24.4.1-windows 2&#xff1a;下载Java 3&#xff1a;配置环境变量&#xff1a;关于怎么配置环境变量&#xff08;百度一下&#xff1a;monkey环境搭建&#xff0c;&#xff09; 二&#xff1a;monkey测试&#xff1…

再次总结nios II 下载程序到板子上时出现 Downloading RLF Process failed的问题

之前也写过两篇关于NIOS II 出现&#xff1a;Downloading RLF Process failed的问题&#xff0c;但是总结都不是很全面&#xff0c;小梅哥的教程总结的比较全面特此记录。 问题&#xff1a;nios II 下载程序到板子上时出现 Downloading RLF Process failed的问题。 即当nios中…

基于electron25+vite4创建多窗口|vue3+electron25新开模态窗体

在写这篇文章的时候&#xff0c;查看了下electron最新稳定版本由几天前24.4.0升级到了25了&#xff0c;不得不说electron团队迭代速度之快&#xff01; 前几天有分享一篇electron24整合vite4全家桶技术构建桌面端vue3应用示例程序。 https://www.cnblogs.com/xiaoyan2017/p/17…

7.JavaScript-vue

1 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演…

2023 彩虹全新 SUP 模板,卡卡云模板修复版

2023 彩虹全新 SUP 模板&#xff0c;卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化&#xff0c;修复了 PC 端购物车页面显示不正常的问题。 使用教程 将这俩个数据库文件导入数据库&#xff1b; 其他的直接导入网站根目录覆盖就好&#xff1b; 若首页显示不正常&a…

游戏逆向中的 NoClip 手段和安全应对方式

文章目录 墙壁边界寻找碰撞 NoClip 是一种典型的黑客行为&#xff0c;允许你穿过墙壁&#xff0c;所以 NoClip 又可以认为是避免碰撞体积的行为 墙壁边界 游戏中设置了碰撞体作为墙壁边界&#xff0c;是 玩家对象 和墙壁发生了碰撞&#xff0c;而不是 相机 玩家对象有他的 X…

操作系统初探 - 进程的概念

目录 预备知识 冯诺依曼和现代计算机结构 操作系统的理解 进程和PCB的概念 PCB中的信息 查看进程信息的指令 - ps pid 进程状态 预备知识 在学习操作系统之前我们需要先了解一下如下的预备知识。 冯诺依曼和现代计算机结构 美籍匈牙利科学家冯诺依曼最先提出“程序存…

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving

● MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving&#xff08;基于神经辐射场的自动驾驶仿真器&#xff09; ● https://github.com/OPEN-AIR-SUN/mars ● https://arxiv.org/pdf/2307.15058.pdf ● https://mp.weixin.qq.com/s/6Ion_DZGJ…