springboot多数据源



1、配置application.yml

多数据源可以配置不同类型的数据库,如oracle和mysql如下

spring:
datasource:
main:
driver-class-name: oracle.jdbc.driver.OracleDriver
jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:TESTDB
username: root
password: root
other:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: 123456

注意:​ 与单数据源不同,在datasource后需要给每个数据源命名,并且将​url​改为​jdbc-url

2、Mapper目录

根据数据源将mapper.java和mapper.xml区分开

springboot多数据源_数据库springboot多数据源_java_02

3、配置DataSourceConfig配置文件

  • 配置文件中配置​@MapperScan​后,不需要额外在启动类中配置
  • 注解​@basePackages​指明 Mapper 地址
  • 注解​@sqlSessionTemplateRef​指定 Mapper 路径下注入的 sqlSessionTemplate。
  • 如果用myBatis,​SqlSessionFactory​部分可以使用SqlSessionFactoryBean来生成。但是如果用mybatis plus一定要用​MybatisSqlSessionFactoryBean​来生成SqlSessionFactory。否则会报错 ,无法直接通过BaseMapper去调用查询。

1.DataSourceMainConfig

/**
* @Description : 主数据源配置
* @Author : SherlockerSun
* @Date : 2022/3/23 10:10
*/
@Configuration
@MapperScan(basePackages = {"com.springboot.test.demo.dao.main"}, sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class DataSourceMainConfig {

//首先加载配置的数据源:
@Bean(name = "mainDataSource")
@ConfigurationProperties(prefix = "spring.datasource.main")
@Primary
public DataSource mainDataSource() {
return DataSourceBuilder.create().build();
}

//根据创建的数据源,构建对应的 SqlSessionFactory。
@Bean(name = "mainSqlSessionFactory")
@Primary
public SqlSessionFactory mainSqlSessionFactory(@Qualifier("mainDataSource") DataSource dataSource) throws Exception {
//mybatis-plus使用MybatisSqlSessionFactoryBean,普通使用SqlSessionFactoryBean
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/oracle/main/**/*.xml"));
return bean.getObject();
}

//同时将数据源添加到事务中。
@Bean(name = "mainTransactionManager")
@Primary
public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

//接下来将上面创建的 SqlSessionFactory 注入,创建我们在 Mapper 中需要使用的 SqlSessionTemplate。
@Bean(name = "mainSqlSessionTemplate")
@Primary
public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

2.DataSourceOtherConfig

DataSourceOtherConfig的配置和上面类似,方法上需要去掉 @Primary 注解,替换对应的数据源和 Mapper 路径即可

/**
* @Description : 其他数据源配置
* @Author : SherlockerSun
* @Date : 2022/3/23 10:10
*/
@Configuration
@MapperScan(basePackages = {"com.springboot.test.demo.dao.other"}, sqlSessionTemplateRef = "otherSqlSessionTemplate")
public class DataSourceOtherConfig {

//首先加载配置的数据源:
@Bean(name = "otherDataSource")
@ConfigurationProperties(prefix = "spring.datasource.other")
public DataSource otherDataSource() {
return DataSourceBuilder.create().build();
}

//根据创建的数据源,构建对应的 SqlSessionFactory。
@Bean(name = "otherSqlSessionFactory")
public SqlSessionFactory otherSqlSessionFactory(@Qualifier("otherDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/oracle/other/**/*.xml"));
return bean.getObject();
}

//同时将数据源添加到事务中。
@Bean(name = "otherTransactionManager")
public DataSourceTransactionManager otherTransactionManager(@Qualifier("otherDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

//接下来将上面创建的 SqlSessionFactory 注入,创建我们在 Mapper 中需要使用的 SqlSessionTemplate。
@Bean(name = "otherSqlSessionTemplate")
public SqlSessionTemplate otherSqlSessionTemplate(@Qualifier("otherSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

4、使用

直接在service中调用对应的mapper就可以了