springboot 配置多数据源

最详细的SpringBoot配置多数据源讲解 关于springboot配置多数据源整理了笔记,分享给有需要的小伙伴,视频是看的动力节点王鹤老师讲的springboot, 动力节点王鹤老师讲解的springboot教程,由浅入深,带你体验Spring Boot的极速开发过程,内容丰富,涵盖了SpringBoot开发的方方面面,并且同步更新到Spring Boot 2.x系列的最新版本。 视频链接:动力节点springboot视频教程-初学springboot必备教程-springboot最新完整版_哔哩哔哩_bilibili你的三连就是录制视频的动力 阅读详情

原文地址:点击打开链接

此文采用spring boot官方文档中推荐的方法是用的多数据源,但非mybatis官网推荐的使用配置的 mybatis-spring-boot-starter 的方法


1.首先在创建应用对象时引入autoConfig

  1. @ComponentScan  
  2. @EnableAutoConfiguration  
  3. public class Application extends SpringBootServletInitializer {  
  4.   
  5.     public static void main(String[] args) {  
  6.         SpringApplication app = new SpringApplication(Application.class);  
  7.         app.run(args);  
  8.         //SpringApplication.run(Application.class, args);  
  9.     }  
  10.       
  11.     @Override  
  12.     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {  
  13.         return application.sources(Application.class);  
  14.     }  
  15. }  

2.其次配置文件

  1. ######primary#############  
  2. datasource.primary.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=PlayNowLog  
  3. datasource.primary.username=sa  
  4. datasource.primary.password=xxxxxx  
  5. datasource.primary.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver  
  6.   
  7.   
  8. ######secondary#############  
  9. datasource.secondary.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=PlayNow_New  
  10. datasource.secondary.username=sa  
  11. datasource.secondary.password=xxxxxx  
  12. datasource.secondary.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver  

3.再其次是数据源的创建

  1. @Configuration  
  2. public class GlobalDataConfiguration {  
  3.     @Bean(name="primaryDataSource")  
  4.     @Primary  
  5.     @ConfigurationProperties(prefix="datasource.primary")  
  6.     public DataSource primaryDataSource() {  
  7.         System.out.println("-------------------- primaryDataSource init ---------------------");  
  8.         return DataSourceBuilder.create().build();  
  9.     }  
  10.       
  11.     @Bean(name="secondaryDataSource")  
  12.     @ConfigurationProperties(prefix="datasource.secondary")  
  13.     public DataSource secondaryDataSource() {  
  14.         System.out.println("-------------------- secondaryDataSource init ---------------------");  
  15.         return DataSourceBuilder.create().build();  
  16.     }  
  17. }  


4.Dao层使用数据源

  1. @Component  
  2. public class UserDaoImpl<T extends com.sonychina.backend.entity.statistic.SysUser> extends MyBatisBaseDao<SysUser> implements UserDao {  
  3.       
  4.     @Autowired  
  5.     public UserDaoImpl(@Qualifier("secondaryDataSource") DataSource dataSource) {  
  6.         super(dataSource);  
  7.     }  
  8. }  


 

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;

import com.sonychina.backend.global.Constants;
import com.sonychina.backend.utility.GenericsUtils;
import com.sonychina.backend.utility.MapResultHandler;
import com.sonychina.backend.utility.MyBatisUtil;
import com.sonychina.backend.utility.PageView;

public class MyBatisBaseDao<T>{
    private Class<T> type;
    private SqlSession session;
    
    @SuppressWarnings("unchecked")
	public MyBatisBaseDao(DataSource dataSource){
		type = (Class<T>) GenericsUtils.getActualReflectArgumentClass(this.getClass());
		System.out.println("------------- BaseMybatisDao initialize--------------------------");
		System.out.println("------------- T:" + type.toString());
		try {
			MyBatisUtil myBatisUtil = MyBatisUtil.getInstance(dataSource);
			session = myBatisUtil.getSession();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    
    private String getMethodPath(String methodType){
        return getMethodPath(methodType, "");
    }
    
    private String getMethodPath(String methodType, String methodSuffix){
        return Constants.MYBATIS_MAPPER_PRIX + methodType + type.getSimpleName() + methodSuffix;
    }
    
    public void save(T obj) {
        session.insert(getMethodPath("save"), obj);
    }

    public void delete(T obj) {
        session.delete(getMethodPath("delete"), obj);
    }

    public void update(T obj) {
        session.update(getMethodPath("update"), obj);
        //HashMap<String,Object> map = null;
    }

    public T get(Integer id) {
        return session.selectOne(getMethodPath("get"),id);
    }
    
    public List<T> getList(T entity){
    	return session.selectList(getMethodPath("get", "List"), entity);
    }
    
    public List<T> getListByAnyObject(Object entity){
    	return session.selectList(getMethodPath("get", "List"), entity);
    }
    
    /**
     * 
     * @param entity
     * @param selectId:mapper。xml文件中<select>标签ID
     * @return
     */
    public List<T> getList(T entity, String selectId){
    	return session.selectList(selectId, entity);
    }
    
    public List<T> getListByAnyObject(Object entity, String selectId){
    	return session.selectList(selectId, entity);
    }
    
    public List<Map<String, Object>> getMapList(Map<String, Object> map){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "MapList"), map, mh);
    	return mh.getMappedResults();
    }
    
    /**
     * 
     * @param map
     * @param selectId:mapper。xml文件中<select>标签ID
     * @return List<Map<String, Object>>
     */
    public List<Map<String, Object>> getMapList(Map<String, Object> map, String selectId){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(selectId, map, mh);
    	return mh.getMappedResults();
    }
    
    public List<Map<String, Object>> getMapList(T entity){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "MapList"), entity, mh);
    	return mh.getMappedResults();
    }

    public List<Map<String, Object>> getMapList(T entity,String queryName){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(queryName, entity, mh);
    	return mh.getMappedResults();
    }

    public Long getCount(Map<String, Object> pm){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(getMethodPath("get", "Count"),pm, mh);
    	return mh.getCount();
    }
    
    /**
     * 
     * @param pm
     * @param selectId:mapper。xml文件中<select>标签ID
     * @return Long
     */
    public Long getCount(Map<String,Object> pm, String selectId){
    	MapResultHandler mh = new MapResultHandler();
    	session.select(selectId,pm, mh);
    	return mh.getCount();
    }
    
    /**
     * map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
     * 且其值不能为空
     * @param map
     * @return PageView
     */
    public PageView getPageList(Map<String, Object> map){
    	
    	if(map == null || map.get("currentPageNum") == null){
    		return null;
    	} else{
    		PageView page = null;
    		Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
    		if(map.get("pageShowCnt") == null){
    			page = new PageView(pageNum);
    		} else {
    			Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
    			page = new PageView(pageNum, showCnt);
    		}
    		map.put("start", page.getStart());
    		map.put("end", page.getCurrentMaxCnt());
    		//System.out.println("-----------start:" + map.get("start"));
    		//System.out.println("-----------start:" + map.get("maxCnt"));
    		MapResultHandler mh = new MapResultHandler();
    		page.setTotalRecord(this.getCount(map));
        	session.select(getMethodPath("get", "MapPageList"), map, mh);
        	page.setResultList(mh.getMappedResults());
        	
        	return page;
    	}
    }
    
    /**
     * map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
     * 且其值不能为空
     * @param map
     * @param selectConutId, mapper.xml文件中<select>标签Id, 查询总记录数的sql语句
     * @param selectPageListId, mapper.xml文件中<select>标签Id,查询分页后数据列表的sql语句
     * @return
     */
    public PageView getPageList(Map<String, Object> map, String selectConutId, String selectPageListId){
    	
    	if(map == null || map.get("currentPageNum") == null){
    		return null;
    	} else{
    		PageView page = null;
    		Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
    		if(map.get("pageShowCnt") == null){
    			page = new PageView(pageNum);
    		} else {
    			Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
    			page = new PageView(pageNum, showCnt);
    		}
    		map.put("start", page.getStart());
    		map.put("end", page.getCurrentMaxCnt());
    		//System.out.println("-----------start:" + map.get("start"));
    		//System.out.println("-----------start:" + map.get("maxCnt"));
    		MapResultHandler mh = new MapResultHandler();
    		page.setTotalRecord(this.getCount(map, selectConutId));
        	session.select(selectPageListId, map, mh);
        	page.setResultList(mh.getMappedResults());
        	
        	return page;
    	}
    }
    
    /**
     * map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
     * 且其值不能为空
     * @param map
     * @param selectConutId, mapper.xml文件中<select>标签Id, 查询总记录数的sql语句
     * @param selectPageListId, mapper.xml文件中<select>标签Id,查询分页后数据列表的sql语句
     * @return
     */
    public PageView getEntityPageList(Map<String, Object> map, String selectConutId, String selectPageListId){
    	
    	if(map == null || map.get("currentPageNum") == null){
    		return null;
    	} else{
    		PageView page = null;
    		Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
    		if(map.get("pageShowCnt") == null){
    			page = new PageView(pageNum);
    		} else {
    			Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
    			page = new PageView(pageNum, showCnt);
    		}
    		map.put("start", page.getStart());
    		map.put("end", page.getCurrentMaxCnt());
    		//System.out.println("-----------start:" + map.get("start"));
    		//System.out.println("-----------start:" + map.get("maxCnt"));
    		page.setTotalRecord(this.getCount(map, selectConutId));
        	page.setResultList(session.selectList(selectPageListId, map));
        	
        	return page;
    	}
    }
    
    /**
     * map 中必须包含 key:currentPageNum 且其值不能为空, 页面显示的记录数不是10必须包含key:pageShowCnt
     * 且其值不能为空
     * @param map
     * @return PageView
     */
    public PageView getEntityPageList(Map<String, Object> map){
    	
    	if(map == null || map.get("currentPageNum") == null){
    		return null;
    	} else{
    		PageView page = null;
    		Integer pageNum = Integer.valueOf(map.get("currentPageNum").toString());
    		if(map.get("pageShowCnt") == null){
    			page = new PageView(pageNum);
    		} else {
    			Integer showCnt = Integer.valueOf(map.get("pageShowCnt").toString());
    			page = new PageView(pageNum, showCnt);
    		}
    		map.put("start", page.getStart());
    		map.put("end", page.getCurrentMaxCnt());
    		//System.out.println("-----------start:" + map.get("start"));
    		//System.out.println("-----------start:" + map.get("maxCnt"));
    		page.setTotalRecord(this.getCount(map));
        	page.setResultList(session.selectList(getMethodPath("get", "PageList"), map));
        	
        	return page;
    	}
    }
}

【Educoder作业】※ 数字图像——绿幕抠像 这次作业比上一篇博客基本得多,大多都是基础函数的运用。没啥说的,就整个sizesizesize即可。 T2 获取一个像素 T3 图像反色 T4 修改透明度 ′RGBA′'RGBA'′RGBA′也是一种图像格式 T5 抠图 T6 添加场景 这个主要是pastepastepaste函数里面的maskmaskmask参量没整明白,转载一篇博客供参考。... 阅读详情

相关推荐

家庭网络中,路由器和交换机的连接顺序

它的目的是给路由器增加端口,用户访问互联网的速度比情况一要快,常用于办公网络、家庭成员多的场景。光纤入户首先连接的肯定是光猫,而在光猫的后面,是先连接交换机?还是应该接路由器呢?家庭网络中路由器和交换机的先后连接顺序。它目的是让更多的用户访问互联网。常用于一些超大型机房、网吧等。至于路由器和交换机的区别。两者之间很多功能都有兼容。但用户上网速度相对较慢。在技术日益迭代的今天。

m0_74075744的博客 1万+

SpringBoot多数据源配置

文章目录1 SpringBoot分库配置1.1 准备数据1.2 springboot+mybatis使用分包方式整合1.2.1 pom.xml1.2.2 application.yml 配置文件1.2.3 连接数据源配置文件1.2.3.1 连接源配置一1.2.3.2 连接源配置二1.2.4 项目结构1.3 springboot+druid+mybatisplus使用注解整合1.3.1 pom.xml1.3.2 application.yml 配置文件1.3.3 使用@DS区分数据源1.4 读写分离库1.4.

上善若泪 3万+

山东大学软件学院计算机组成原理课程设计实验三

文章目录一、实验时间二、实验内容1. 实验目的2. 设计要求3. 实验基本思路三、电路图1. 可预置初值的模256异步计数器2. 8位ALU电路3. 总图四、补充 一、实验时间 第三次实验:2021年4月8日星期四,第六周 第一次部件级实验,开始算分 二、实验内容 微程序控制的运算器设计 1. 实验目的 (1)熟悉简单运算器的结构 (2)熟悉微命令的产生和时序 (3)熟悉运算器功能测试。 2. 设计要求 利用之前设计的具有超前进位功能的8位ALU,实现简单算术或逻辑运算 两操作数由八位寄存器R0、R1提供,

叶卡捷琳堡的博客 1万+

springboot配置多个数据源(两种方式)

在我们的实际业务中可能会遇到;在一个项目里面读取多个数据库的数据来进行展示,spring对同时配置多个数据源是支持的。 本文中将展示两种方法来实现这个功能。 springboot+mybatis 第一种方式: 在配置文件中配置多个数据源,然后通过配置类来获取数据源以及mapper相关的扫描配置 pom.xml &lt;parent&gt; &lt;groupId&gt;org.s...

qq_38058332的博客 10万+

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 619

WPF实战:利用Live Charts实现高性能动态曲线可视化

本文详细介绍了如何在WPF中使用Live Charts实现高性能动态曲线可视化,特别适用于工业监控和金融分析等实时数据场景。通过增量渲染、内存复用和硬件加速等核心技术,Live Charts能够高效处理高频数据更新,显著提升图表流畅度。文章提供了从基础实现到工业级优化的完整解决方案,帮助开发者应对各种性能挑战。

weixin_29189373的博客 407

springboot项目配置多数据库连接

springboot从建项目开始配置多数据库,已测试验证

xc9711的博客 1万+

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计

本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。

weixin_28704565的博客 567

以Springboot为例,如何连接多个数据库(源)

在Spring Boot中连接多个数据库,可以通过配置多个数据源来实现。可以在配置文件中定义多个数据源的配置,每个数据源有一个唯一的名称和对应的数据源属性。然后,通过在需要访问特定数据源的地方,使用对应的数据源名称来访问该数据源。

qq_48607414的博客 5830

海康威视摄像头网线连接笔记本电脑,客户端提示:1连接设备失败。设备不在线或网络原因引起的连接超时等。(HCNetSDK.dll[7].)解决方案

1.环境 电脑:联想笔记本电脑(win10系统) 摄像头:海康威视DS-2CD3T20D-i5,4mm 连接方式:直接用网线将摄像头和摄像头连接 2.问题: 客户端出现如下提示: 3. 解决流程: 1.确认网线是否有问题:我的网线指示灯常亮,并且设备能够被搜索到,只是一直显示离线 2.按照网上教程直接配置摄像头的ip地址与电脑同一网段:登录失败。 错误码为 HCNetSDK.dll[7].(连接设备失败。设备不在【海康威视吧】_百度贴吧 失败了,没有反应 3.查看有线网卡的地

weixin_48911487的博客 3万+

【JCR一区级】鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测【含Matlab源码 5711期】

鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测 完整代码和数据,方可运行;数据可直接替换,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 3601

SpringBoot多数据源配置详解

动态数据源上下文// 使用ThreadLocal保证线程安全// 数据源列表动态数据源配置/*** 创建动态数据源 Bean,并将其设置为主要的数据源 Bean// 用于存储目标数据源的映射,键为数据源标识,值为数据源实例 Map < Object , Object > targetDataSources = new HashMap < >();

墨鸦的博客 1万+

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A错误码

EtherCAT用TwinCAT 3跑DC报0x2C或者0x1A DC报错 ///////////////////////////////////////////////////////////////////////////////////////// /** \brief Checks communication and synchronisation variables and update AL status / AL status code if an error has occurr

PI_sunyang的博客 5308

springboot+dynamic多数据源配置

springboot+dynamic多数据源配置配置使用 springboot+dynamic多数据源配置 来源:https://mp.baomidou.com/guide/dynamic-datasource.html dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 配置...

weixin_30387663的博客 1916

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

springboot配置多数据源

之前的文章我们已经实现了springboot的连接池,springboot添加数据库连接池druid-优快云博客。现在我们来实现一下多数据源的配置。

bailegebai的博客 3831

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

springboot使用dynamic做多数据源配置

本文介绍一下springboot使用dynamic做动态数据源配置。

qq_50867577的博客 3758

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Springboot多数据源配置

对于SpringMVC,多数据源是通过aop去实现。Springboot也大同小异。 1.配置依赖 除了常规的springboot依赖之外,再加上aop,数据连接池等依赖。 <properties> <java.version>1.8</java.version> <swagger.version>2.9.2</swagger.version> <pagehelper.boot.version>1.2.5</pa.

Shi_Liz的博客 4187

【springboot专题】二十 springboot中如何配置多数据源

使用springboot+mybatis-plus+多数据源+swagger实现多数据源,以及如何解决多数据源事务一致性。

程序猿学社的博客 1万+

SpringBoot配置JPA多数据源

SpringBoot版本 不同的版本其配置方式可能有所区别,我采用的是SpringBoot2.0.4.RELEASE。 多数据源配置 application.yml配置如下: spring: application: name: test jpa: hibernate: ddl-auto: update show-sql: true datasour...

在下的博客 8251

SpringBoot下配置Mybatis多数据源

spring boot 整合mybatis 多数据源。对于现在的web项目来说,很多大一点的项目都是微服务框架,这就导致web项目需要访问多个数据源,每一个小的模块是一个自己独立的数据源。这时候就需要配置多数据源了,对于多数据源,spring boot支持就是需要配置一个主数据源,若干个非主数据源,可以实现自由切换。只是实现数据源bean注入的时候需要注意一下,主数据源需要加上@Primary注解,其他非主数据源一定不能加@Primary注解,否者启动报错。

tianhouquan的专栏 1879

Spring Boot多数据源配置之JdbcTemplate

多数据源配置也算是一个常见的开发需求,Spring和SpringBoot中,对此都有相应的解决方案,不过一般来说,如果有多数据源的需求,我还是建议首选分布式数据库中间件MyCat去解决相关问题,之前有小伙伴在我的知识星球上提问,他的数据根据条件的不同,可能保存在四十多个不同的数据库中,怎么办?这种场景下使用多数据源其实就有些费事了,我给的建议是使用MyCat,然后分表策略使用sharding-by...

江南一点雨的专栏 1万+

SpringBoot实现多数据源配置

SpringBoot实现多数据源配置

一恍过去 3万+

Spring Boot 实现多数据源配置

在application.properties或application.yml中配置多个数据源的连接信息。在 Spring Boot 中实现多数据源配置通常用于需要连接多个数据库的场景。首先,在pom.xml中添加MyBatis、数据库驱动和Spring Boot的JDBC依赖。在Spring Boot中,通过@Configuration类来配置多个数据源的Bean。将Mapper接口和XML文件分别放在不同的包中,以区分不同的数据源。主数据源Mapper XML文件。次数据源Mapper XML文件。

qq_33807380的博客 5831
上一篇: Spring Boot下配置MyBatis多数据源
下一篇: 关于spring boot mybatis 多数据源的多种方法原理概述
ichsonx
博客等级 码龄19年 202粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值