多数据源配置-springBoot

article/2025/9/17 8:27:16

前言

这里展示的是springBoot项目双数据源的配置,为了增加一定的代表性,这里采用两个不同的数据库Orcale和Mysql作为数据源。

依赖

<!-- orcale驱动包 -->
<dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><scope>runtime</scope>
</dependency>
<!-- JDBC:mysql驱动包 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version><scope>runtime</scope>
</dependency><!--德鲁伊,数据库连接池-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version>
</dependency>
<!-- Mybatis_plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis.plus.version}</version><exclusions><exclusion><artifactId>jsqlparser</artifactId><groupId>com.github.jsqlparser</groupId></exclusion><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions>
</dependency>

目录结构

在这里插入图片描述

操作实体类

person

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Setter
@Getter
@ToString
public class Person {private Integer id;private String name;private Integer age;private String parentName;public Person() {}public Person(String name, Integer age, String parentName) {this.name = name;this.age = age;this.parentName = parentName;}
}

数据源配置

application.properties

# 配置orcale的相关连接信息
orcale.dataSource.type= oracle.jdbc.datasource.impl.OracleConnectionPoolDataSource
orcale.dataSource.url = jdbc:oracle:thin:@localhost:1521:orcl?Unicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false
orcale.dataSource.driverClassName = oracle.jdbc.driver.OracleDriver
orcale.dataSource.username = testrole
orcale.dataSource.password = 123456
orcale.dataSource.druid.max-active = 20
orcale.dataSource.druid.initial-size = 20
orcale.dataSource.druid.max-wait = 3000
orcale.dataSource.druid.minIdle = 10
orcale.dataSource.druid.time-between-eviction-runsMillis = 60000
orcale.dataSource.druid.min-evictable-idle-timeMillis = 300000
orcale.dataSource.druid.validation-query = SELECT 1
orcale.dataSource.druid.test-while-idle = true
orcale.dataSource.druid.test-on-borrow = false
orcale.dataSource.druid.test-on-return = false
orcale.dataSource.druid.pool-prepared-statements = false
orcale.dataSource.druid.max-open-prepared-statements = -1
# 配置mysql中的的相关配置
mysql.dataSource.type =com.mysql.cj.jdbc.MysqlDataSource
mysql.dataSource.url = jdbc:mysql://localhost:3306/xmltest?useUnicode=true&characterEncoding=UTF-8&useSSL=false
mysql.dataSource.driverClassName = com.mysql.cj.jdbc.Driver
mysql.dataSource.username = root
mysql.dataSource.password = shijian
mysql.dataSource.druid.max-active = 40
mysql.dataSource.druid.initial-size = 40
mysql.dataSource.druid.max-wait = 3000
mysql.dataSource.druid.minIdle = 20
mysql.dataSource.druid.time-between-eviction-runsMillis = 60000
mysql.dataSource.druid.min-evictable-idle-timeMillis = 300000
mysql.dataSource.druid.validation-query = SELECT 1
mysql.dataSource.druid.test-while-idle = true
mysql.dataSource.druid.test-on-borrow = false
mysql.dataSource.druid.test-on-return = false
mysql.dataSource.druid.pool-prepared-statements = false
mysql.dataSource.druid.max-open-prepared-statements = -1

映射文件

Mysql

mysqlPersonMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.summary.dao.MysqlPersonMapper"><select id="getAll" resultType="com.example.summary.util.Person">SELECT * FROM person</select>
</mapper>

Orcale

orcalePersonMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.summary.dao.OrcalePersonMapper"><select id="getAll" resultType="com.example.summary.util.Person">SELECT * FROM person</select>
</mapper>

mapper

import com.example.summary.util.Person;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface MysqlPersonMapper {List<Person> getAll();
}
import com.example.summary.util.Person;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface OrcalePersonMapper {List<Person> getAll();
}


mapper不能放在一个包内不然就只会让主数据源识别到,其它源无法识别

配置注入

Mysql

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.summary.mysql",sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig {// 读取配置文件中的 spring.datasource配置// 配置多数据源时要默认一个数据源,所以要加 @Primary@ConfigurationProperties(prefix = "mysql.datasource")@Bean(name = "mysqlDataSource")@Primarypublic DataSource dataSource() {return new DruidDataSource();}@Bean(name = "mysqlTransactionManager")@Primarypublic DataSourceTransactionManager mysqlTransactionManager() {return new DataSourceTransactionManager(dataSource());}@Bean(name = "mysqlSqlSessionFactory")@Primarypublic SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(mysqlDataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml"));   // 对应的mapper.xml//mybatis 数据库字段与实体类属性驼峰映射配置sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);return sessionFactory.getObject();}@Bean(name = "mysqlJdbcTemplate")@Primarypublic JdbcTemplate mysqlJdbcTemplate() {return new JdbcTemplate(dataSource());}
}

Orcale

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.summary.orcale",sqlSessionFactoryRef = "orcaleSqlSessionFactory")
public class OrcaleDataSourceConfig {@ConfigurationProperties(prefix = "orcale.datasource")@Bean(name = "orcaleDataSource")public DataSource dataSource() {return new DruidDataSource();}@Bean(name = "orcaleTransactionManager")public DataSourceTransactionManager masterTransactionManager() {return new DataSourceTransactionManager(dataSource());}@Bean(name = "orcaleSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("orcaleDataSource") DataSource masterDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(masterDataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/orcale/*.xml"));   // 对应的mapper.xml//mybatis 数据库字段与实体类属性驼峰映射配置sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);return sessionFactory.getObject();}@Bean(name = "orcaleJdbcTemplate")public JdbcTemplate orcaleJdbcTemplate() {return new JdbcTemplate(dataSource());}
}


@Primary注解代表该数据源为主数据源
@MapperScan的basePackages值代表的是包扫描位置,及该包下的所有mapper都会被扫描且绑定在数据源上

测试

元数据

Mysql
在这里插入图片描述
Orcale
在这里插入图片描述

测试代码

import com.example.summary.mysql.MysqlPersonMapper;
import com.example.summary.orcale.OrcalePersonMapper;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@MapperScan(value = "com.example.summary.dao")
public class test {@AutowiredMysqlPersonMapper mysqlPersonMapper;@AutowiredOrcalePersonMapper orcalePersonMapper;@Testpublic void listAll(){System.out.println("MySQL数据库--------------");System.out.println(mysqlPersonMapper.getAll());System.out.println("Orcale数据库-------------");System.out.println(orcalePersonMapper.getAll());}
}

运行结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/aoeIWpar.shtml

相关文章

若依多数据源配置

1.修改application-druid.yml文件&#xff0c;这里使用mysql数据源&#xff0c;分别有ry-vue、ry-test1、ry-test2三个数据库。 2.修改DataSourceType类&#xff08;MASTER主库&#xff0c;SLAVE、LOGIN两个从库&#xff09;。 3.修改DruidConfig类。 以上配置完成后&#xff0…

如何配置数据源

(一&#xff09;官网 Spring Initializrhttps://start.spring.io/ &#xff08;二&#xff09;各依赖 &#xff08;三&#xff09;打印一下数据源 &#xff08;四&#xff09;查看有哪些bean &#xff08;五&#xff09;不用spring boot自己配置bean 1、数据源相关 • DataSou…

SpringBoot 之数据源配置

文章目录 市面上的几种数据源比对SpringBoot自动装配DataSource原理HiKariCP 数据源配置Druid 数据源配置SpringBoot集成Druid连接池Druid 多数据源配置&#xff08;不同Mapper操作不同数据源&#xff09;HikariCP 多数据源动态配置 springboot2.0整合druid&#xff0c;以及spr…

P值 卡方值

P值&#xff1a; P值即概率&#xff0c;反映某一事件发生的可能性大小。 不同的P数值所表达的含义也是不一样的。 统计学根据显著性检验方法所得到的P 值&#xff0c;一般以P < 0.05 为有统计学差异&#xff0c; P<0.01 为有显著统计学差异&#xff0c;P<0.001为有…

Python数据挖掘学习6卡方检验

1.定义&#xff1a;一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴&#xff0c;主要是比较两个及两个以上样本率( 构成比&#xff09;以及两个分类变量的关联性分析。 2.基本思想&#xff1a;统计样本的实际观测值与理论推断值之间的偏离程度&#xff0c;实际…

python scipy 密度函数 分位数 累计函数计算p值 卡方检验 t检验 F检验 假设检验 AB实验 显著性检验

AB实验&#xff1a; 1. 人均类->t检验 # 计算t值 def get_t(x):# 遍历看x需要几次的显著性检验。可能有多个实验组&#xff0c;需要一对一检验x1 x[x.分组.astype(str)1].iloc[0] # 对照组&#xff0c;组号固定为1&#xff0c;转为Series格式for i in x[x.分组.astype(st…

卡方检验c语言算法,R语言 | 卡方检验(Chi-squaretest)

卡方检验在计数资料中的应用,包括推断两个总体率或构成比之间有无差别、多个总体率或构成比之间有无差别、多个样本率间的多重比较、两个分类变量之间有无关联性、多维列联表的分析和频数分布拟合优度的卡方检验。选自:周支瑞老师 下面分别介绍计数资料怎么进行卡方检验。 目…

SPSS篇—卡方检验

今天依旧跟大家分享一个在SPSS中使用率比较高的分析方法&#xff1a;卡方检验。 在开始做分析之前&#xff0c;我们需要明白两件事情&#xff1a;卡方检验是什么&#xff1f;一般用来干什么&#xff1f;我们只有充分了解分析方法以后才能够正确的使用它。 卡方检验在百科中的…

四格表卡方检验.医学统计实例详解-医学统计助手★卡方检验,t检验,F检验,秩和检验,方差分析

四格表卡方检验是医学统计学中常用的一种方法&#xff0c;用于确定两个分类变量之间是否存在关联。在医学研究中&#xff0c;四格表卡方检验被广泛应用于研究疾病和治疗方法之间的关联&#xff0c;以及预测疾病发展的风险因素。 四格表卡方检验基于一个二维表格&#xff0c;也…

卡方检验四格表怎么做_运用SPSS进行医学诊断数据的Kappa一致性检验 ——【杏花开医学统计】...

杏花开生物医药统计 一号在手,统计无忧! 关 注 运用SPSS进行医学诊断数据的 Kappa一致性检验 关键词:SPSS、 Kappa 导读 在医学诊断试验中,经常会遇到将待评价的诊断实验方法的诊断结果与金标准的诊断结果进行比较的情况,或者是将两种不同的诊断方法用于同一样本的诊断结果…

卡方检验四格表怎么做_等级变量的假设检验怎么做?

作者&#xff1a;丁点helper 来源&#xff1a;丁点帮你 今天&#xff0c;我们讲等级变量的假设检验。首先&#xff0c;回顾一下&#xff0c;什么叫等级变量&#xff0c;也称有序变量。 一般而言&#xff0c;等级变量属于分类变量(如上)的一种&#xff0c;与之相对的就是无序变…

Pearson卡方该如何计算?

一、Pearson卡方 Pearson卡方可用研究定类和定类数据的差异&#xff0c;比如性别和是否吸烟之间的差异关系。 二、分析 SPSSAU通用方法里面的‘交叉&#xff08;卡方&#xff09;’研究方法默认使用Pearson卡方&#xff0c;并且提供百分比按行或者按列两种方式。如下图&…

卡方检验概述

前言、什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴&#xff0c;主要是比较两个及两个以上样本率( 构成比&#xff09;以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。 它在…

Python计算卡方值

Python代码 import numpy as np from scipy.stats import chi2_contingencyd np.array([[2, 1, 1, 0, 276], [9, 7, 4, 2, 258]]) print(chi2_contingency(d)) # 第一个值为卡方值&#xff0c; # 第二个值为P值&#xff0c; # 第三个值为自由度&#xff0c; # 第四个为与原数…

卡方检验值转换为P值

卡方检验作为一种常见的假设检验&#xff0c;在统计学中的地位是显而易见的&#xff0c;如果你还不太清楚可以参看这篇博文:卡方检验用于特征选择&#xff0c;写的非常的浅显易懂&#xff0c;如果你还想再扩展点卡方检验方面的知识&#xff0c;可以参看这篇博文卡方检验基础&am…

别错过,卡方检验实用总结!

通常情况下&#xff0c;卡方检验是研究分类数据与分类数据之间关系的分析方法&#xff0c;如性别和是否戴隐形眼镜之间的关系。卡方检验通常会涉及卡方值和P值两个名词术语。卡方值与P值有对应关系&#xff0c;P值小于0.05则说明有差异存在&#xff0c;即性别与是否戴隐形眼镜之…

【数据分析与数据挖掘】四、多因子与复合分析(上)

这一章内容&#xff1a;属性与属性之间常见的联系。 理论铺垫&#xff1a; 假设检验与方差检验&#xff1b;相关系数&#xff1a;皮尔逊、斯皮尔曼&#xff1b;回归&#xff1a;线性回归&#xff1b;PCA与奇异值分解&#xff1b; 1.假设检验 概念&#xff1a;做出一个假设&…

2020淘宝双11超级星秀猫怎么踢人 最强星秀猫怎么退出队伍

2020年的天猫双十一的喵币活动是叫—超级星秀猫&#xff0c;还是一个养猫的活动&#xff0c;不过是可以组队的&#xff0c;有的朋友是想把临时的人踢出队伍或者是自己离开队伍&#xff0c;但是不知道怎么操作&#xff0c;下面就来为大家详细的介绍一下。 1、踢人&#xff1a;今…

单点登录 ( 踢人模式 )

这是最终效果图 实现用户账号在别处登陆&#xff0c;踢出上个已经登陆的账号 单点登陆基本原理: 项目Demo结构 项目 demo 源码 https://github.com/610627597/TestDemo

Spring Security OAuth2 实现多人登录互踢下线

背景说明 一个账号只能一处登录&#xff0c;类似的业务需求在现有后管类系统是非常常见的。但在原有的 spring security oauth2 令牌方法流程&#xff08;所谓的登录&#xff09;无法满足类似的需求。 我们先来看 TokenEndpoint 的方法流程 客户端 带参访问 /oauth/token 接…