springboot如何配置多个数据源呢?
下文笔者讲述SpringBoot配置多个数据源的方法及示例分享,如下所示
配置多个数据源的实现思路
一、配置文件进行配置: 1.导入依赖: 二、编写配置类: 1.用来指定包扫描、指定sqlSessionTemplateRef 2.用来指定mapper.xml的路径 3.Mybatis主数据源ds1配置 4.Mybatis第二个ds2数据源配置 5.Mybatis第三个数据源配置例:
导入数据源连接所需的驱动
1.导入依赖: 如 MySQL 和 PGSQL <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>Runtime</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.7</version> </dependency>
yml配置
spring:
# 数据源配置
datasource:
ds1: #数据源1
driver-class-name: com.mysql.jdbc.Driver # mysql的驱动你可以配置别的关系型数据库
url: jdbc:mysql://ip:3306/db1 #数据源地址
username: root # 用户名
password: root # 密码
ds2: # 数据源2
driver-class-name: com.mysql.jdbc.Driver # mysql的驱动你可以配置别的关系型数据库
url: jdbc:mysql://ip:3307/db2#数据源地址
username: root # 用户名
password: root # 密码
编写配置类
编写Springboot的配置类:
mybatis多数据源切换的原理
根据不同包
调用不同的数据源
将mapper.java和mapper.xml 写在某个package中
springboot自动帮你实现数据源切换。
//指定包扫描
//指定sqlSessionTemplateRef
@MapperScan(basePackages ="com.web.ds2.**.dao",
sqlSessionTemplateRef = "ds2SqlSessionTemplate")
//用来指定mapper.xml的路径
sqlSessionFactory.
setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/web/ds2/**/*.xml"));
Mybatis主数据源ds1配置
/**
* Mybatis主数据源ds1配置
* 多数据源配置依赖数据源配置
* DataSourceConfig
*/
@Configuration
@MapperScan(basePackages ="com.web.ds1.**.dao", sqlSessionTemplateRef = "ds1SqlSessionTemplate")
public class MybatisPlusConfig4ds1 {
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.ds1")
@Primary
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
//主数据源 ds1数据源
@Primary
@Bean("ds1SqlSessionFactory")
public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/web/ds1/**/*.xml"));
return sqlSessionFactory.getObject();
}
@Primary
@Bean(name = "ds1TransactionManager")
public DataSourceTransactionManager ds1TransactionManager(@Qualifier("ds1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "ds1SqlSessionTemplate")
public SqlSessionTemplate ds1SqlSessionTemplate(@Qualifier("ds1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
Mybatis第二个ds2数据源配置
/**
* Mybatis 第二个ds2数据源配置
* 多数据源配置依赖数据源配置
* @see DataSourceConfig
*/
@Configuration
@MapperScan(basePackages ="com.web.ds2.**.dao", sqlSessionTemplateRef = "ds2SqlSessionTemplate")
public class MybatisPlusConfig4ds2 {
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
//ds2数据源
@Bean("ds2SqlSessionFactory")
public SqlSessionFactory ds2SqlSessionFactory(@Qualifier("ds2DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath*:com/web/ds2/**/*.xml"));
return sqlSessionFactory.getObject();
}
//事务支持
@Bean(name = "ds2TransactionManager")
public DataSourceTransactionManager ds2TransactionManager(@Qualifier("ds2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "ds2SqlSessionTemplate")
public SqlSessionTemplate ds2SqlSessionTemplate(@Qualifier("ds2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
Mybatis第三个数据源配置(另一种配置方法
有DataSourceTransactionManager 事务管理
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories({"xxx.xxx.xx.xx.xx"})
@MapperScan(basePackages = {"xx.xx.xx.xx.xx.xx"}, sqlSessionFactoryRef = "sqlSessionFactory")
public class PrimaryDataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "mybatis-plus.configuration")
public MybatisConfiguration globalConfiguration() {
return new MybatisConfiguration();
}
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//这里将下划线映射为驼峰的配置引入
bean.setConfiguration(globalConfiguration());
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));
return bean.getObject();
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
例
Service层:
@Service
public class TestService {
@Resource
private ClusterMapper clusterMapper;
@Resource
private MasterMapper masterMapper;
public list<HashMap<String, Object>> queryBooks() {
return masterMapper.queryBooks(); //指定的配置类扫描的是一个包
}
public List<HashMap<String, Object>> queryOrders() {
return clusterMapper.queryOrders(); //指定的配置类扫描的是另一个包
}
}
Controller层:
@RestController
@RequestMapping(value = "/test", method = RequestMethod.POST)
public class TestController {
@Resource
private TestService testService;
@RequestMapping("/books")
public List<HashMap<String, Object>> queryBooks() {
return testService.queryBooks();
}
@RequestMapping("/orders")
public List<HashMap<String, Object>> queryOrders() {
return testService.queryOrders();
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


