readme: 本文实现在同一个springboot服务上配置两个数据库源,如果想要添加更多数据库源,或者不同服务器的数据库源均可,文中会提示如何操作。
1.数据源配置文件:
数据源配置文件内容如下:
spring:
datasource:
aaa:
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db_aa?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
username: root
password: ***
bbb:
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db_bb?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
username: root
password: ***
如果按树结构去写配置文件,一定要注意缩进以及表达的含义。
2.修改springboot服务启动文件:PreprocessServiceApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@SpringBootApplication()
@EnableDiscoveryClient
@EnableEurekaClient
public class PreprocessServiceApplication {
public static void main(String[] args) {
SpringApplication.run(PreprocessServiceApplication.class, args);
}
}
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})意为:去掉springboot服务启动时对于数据源配置的自动导入。后面我们会手动配置多个数据源。
如果有需要,也可把事务管理与mybatis的自动导入去掉,注解为:
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
3.配置两个数据源(也可多个)
注:以下三个文件都在config包下
DataSourceConfig.java
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 javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "aaa")
@ConfigurationProperties(prefix = "spring.datasource.aaa")
public DataSource dataSourcePreprocess() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "bbb")
@ConfigurationProperties(prefix = "spring.datasource.bbb")
public DataSource dataSourceSentence() {
return DataSourceBuilder.create().build();
}
//如果有更多的数据源需要,在此添加相关的bean,注意bean属性name,@ConfigurationProperties为配置文件配置数据源的前缀
//有一个bean就要对于在config文件夹创建对应的xxxConfig.java文件生成工厂
}
aaaConfig.java
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = {"com.dao.aaa"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisPreprocessConfig {
@Autowired
@Qualifier("aaa")
private DataSource ds1;
@Bean(name = "sqlSessionFactory1")
@Primary
public SqlSessionFactory sqlSessionFactory1() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(ds1);
return sqlSessionFactoryBean.getObject();
}
@Bean
@Primary
public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory1());
return sqlSessionTemplate;
}
}
bbbConfig.java
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = {"com.dao.bbb"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisSentenceConfig {
@Autowired
@Qualifier("bbb")
private DataSource ds2;
@Bean(name = "sqlSessionFactory2")
@Primary
public SqlSessionFactory sqlSessionFactory2() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(ds2);
return sqlSessionFactoryBean.getObject();
}
@Bean
@Primary
public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory2());
return sqlSessionTemplate;
}
}
4.dao包结构如下:
dao
aaa
xxxdao.java
bbb
yyydao.java
ccc
zzzdao.java
一定注意!!一个数据源对应dao下面的一个子包!
5.运行测试
自己测。。
参考链接:
https://blog.csdn.net/mengda_lei/article/details/81484355
https://blog.csdn.net/weixin_40085570/article/details/80968099