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
*/
(basePackages = {"com.springboot.test.demo.dao.main"}, sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class DataSourceMainConfig {
//首先加载配置的数据源:
(name = "mainDataSource")
(prefix = "spring.datasource.main")
public DataSource mainDataSource() {
return DataSourceBuilder.create().build();
}
//根据创建的数据源,构建对应的 SqlSessionFactory。
(name = "mainSqlSessionFactory")
public SqlSessionFactory mainSqlSessionFactory( ("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();
}
//同时将数据源添加到事务中。
(name = "mainTransactionManager")
public DataSourceTransactionManager mainTransactionManager( ("mainDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
//接下来将上面创建的 SqlSessionFactory 注入,创建我们在 Mapper 中需要使用的 SqlSessionTemplate。
(name = "mainSqlSessionTemplate")
public SqlSessionTemplate mainSqlSessionTemplate( ("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
2.DataSourceOtherConfig
DataSourceOtherConfig的配置和上面类似,方法上需要去掉 @Primary 注解,替换对应的数据源和 Mapper 路径即可
/**
* @Description : 其他数据源配置
* @Author : SherlockerSun
* @Date : 2022/3/23 10:10
*/
(basePackages = {"com.springboot.test.demo.dao.other"}, sqlSessionTemplateRef = "otherSqlSessionTemplate")
public class DataSourceOtherConfig {
//首先加载配置的数据源:
(name = "otherDataSource")
(prefix = "spring.datasource.other")
public DataSource otherDataSource() {
return DataSourceBuilder.create().build();
}
//根据创建的数据源,构建对应的 SqlSessionFactory。
(name = "otherSqlSessionFactory")
public SqlSessionFactory otherSqlSessionFactory( ("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();
}
//同时将数据源添加到事务中。
(name = "otherTransactionManager")
public DataSourceTransactionManager otherTransactionManager( ("otherDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
//接下来将上面创建的 SqlSessionFactory 注入,创建我们在 Mapper 中需要使用的 SqlSessionTemplate。
(name = "otherSqlSessionTemplate")
public SqlSessionTemplate otherSqlSessionTemplate( ("otherSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4、使用
直接在service中调用对应的mapper就可以了