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区分开
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就可以了