新项目用到spring boot框架,在链接多数据源时,如何配置动态数据库?看了一圈,网上有很多种方式,如xml配置sqlSessionFactory。或者通过AOP切面的方式,后来想想,总感觉这种方式比较繁琐,后台看到一个想法,通过文件所属目录来区分数据库,我觉得挺好的。
一、SpringBootApplication配置
首先要将spring boot自带的DataSourceAutoConfiguration
禁掉,因为它会读取application.properties
文件的spring.datasource.*
属性并自动配置单数据源。在@SpringBootApplication
注解中添加exclude
属性即可:
@EnableFeignClients
@Import(BecloudAutoConfigServiceWrapper.class)
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class})
public class BecloudServicePaymentApplication {
public static void main(String[] args) {
SpringApplication.run(BecloudServicePaymentApplication.class, args);
}
}
二、首先是application.properties配置(路径:resources/application.properties)
# MysqlSQL database -- auth
spring.datasource.auth.url=jdbc:mysql://ip:3306/auth?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true
spring.datasource.auth.username=username
spring.datasource.auth.password=password
spring.datasource.auth.driver-class-name=com.mysql.jdbc.Driver
# PostgreSQL database -- mbox
spring.datasource.mbox.url=jdbc:postgresql://ip:port/mbox?charSet=utf-8
spring.datasource.mbox.username=username
spring.datasource.mbox.password=password
spring.datasource.mbox.driver-class-name=org.postgresql.Driver
# PostgreSQL database -- risk
spring.datasource.risk.url=jdbc:postgresql://ip:port/risk?charSet=utf-8
spring.datasource.risk.username=username
spring.datasource.risk.password=password
spring.datasource.mbox.driver-class-name=org.postgresql.Driver
三、项目目录结构
四、设置DataSourceConfig.java
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class DataSourceConfig {
@Bean(name = "authMasterDS")
@Primary //主数据库
@ConfigurationProperties(prefix = "spring.datasource.auth") // application.properteis中对应属性的前缀
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "mboxMasterDS")
@ConfigurationProperties(prefix = "spring.datasource.mbox") // application.properteis中对应属性的前缀
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
@Bean(name = "riskMasterDS")
@ConfigurationProperties(prefix = "spring.datasource.risk") // application.properteis中对应属性的前缀
public DataSource dataSource3() {
return DataSourceBuilder.create().build();
}
}
五、配置SqlSessionFactory
5.1、
MybatisAuthConfig.java
import javax.sql.DataSource;
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.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = {"com.becloud.service.payment.mapper.auth","evo.cloud.auths.dao"}, sqlSessionFactoryRef = "sqlSessionFactory1")//根据basePackages目录来区分数据库,访问该目录下的mapper文件,则链接该数据库
public class MybatisAuthConfig {
@Autowired
@Qualifier("authMasterDS")
private DataSource auth;
@Bean
public SqlSessionFactory sqlSessionFactory1() throws Exception {
System.out.println("=====================================================================");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(auth); // 使用auth数据源, 连接auth库
//扫描对应的mapper文件
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/auth/*Mapper.xml"));//resources/mapper目录最好和src/main/java下面的mapper目录保持一致,用来注入xml文件
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
return template;
}
}
5.2、MybatisMboxConfig
import javax.sql.DataSource;
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.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = {"com.becloud.service.payment.mapper.mbox"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisMboxConfig {
@Autowired
@Qualifier("mboxMasterDS")
private DataSource mbox;
@Bean
public SqlSessionFactory sqlSessionFactory2() throws Exception {
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(mbox); // 使用mbox数据源, 连接mbox库
//扫描对应的mapper文件
// factoryBean.setMapperLocations(new Resource[]{new ClassPathResource("mapper/mbox/PayProdMapper.xml")});
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/mbox/*Mapper.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2()); // 使用上面配置的Factory
return template;
}
}
5.3、配置MybatisRiskConfig.java
import javax.sql.DataSource;
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.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = {"com.becloud.service.payment.mapper.risk"}, sqlSessionFactoryRef = "sqlSessionFactory3")
public class MybatisRiskConfig {
@Autowired
@Qualifier("riskMasterDS")
private DataSource risk;
@Bean
public SqlSessionFactory sqlSessionFactory3() throws Exception {
System.out.println("=====================================================================");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(risk); // 使用risk数据源, 连接risk库
//扫描对应的mapper文件
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/risk/*Mapper.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate3() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory3()); // 使用上面配置的Factory
return template;
}
}
然后启动项目:
如果访问“com.becloud.service.payment.mapper.auth”或者“evo.cloud.auths.dao”路径下j的mapper类则表示访问的是 auth数据库。
若访问的是“com.becloud.service.payment.mapper.mbox”路径下j的mapper类则表示访问的是mbox数据库。