当前环境
springboot 2.0.3
jdk1.8
多数据源配置
与单数据源不同的是不需要配置默认的spring.datasource,应为Spring自动配置加载到默认的就不会启动自定义的数据源配置类。
第一步、数据源
分别为表test1和test2
# mysql
spring.datasource.test1.jdbc-url=jdbc:mysql://192.168.88.88:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.test1.username=test1
spring.datasource.test1.password=123456
spring.datasource.test1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url=jdbc:mysql://192.168.88.88:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.test2.username=test2
spring.datasource.test2.password=123456
spring.datasource.test2.driver-class-name=com.mysql.jdbc.Driver
第二步、数据源配置
MapperTest1Config
package com.example.framework.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = {"com.example.test1.mpr"}, sqlSessionFactoryRef = "test1SqlSessionFactory")
public class MapperTest1Config {
@Bean(name = "test1DataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "test1TransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "test1SqlSessionFactory")
public SqlSessionFactory basicSqlSessionFactory(@Qualifier("test1DataSource") DataSource basicDataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(basicDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/example/test1/mpr/*.xml"));
return factoryBean.getObject();
}
}
MapperTest2Config
package com.example.framework.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = {"com.example.test2.mpr"}, sqlSessionFactoryRef = "test2SqlSessionFactory")
public class MapperTest2Config {
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test2TransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test2SqlSessionFactory")
public SqlSessionFactory basicSqlSessionFactory(@Qualifier("test2DataSource") DataSource basicDataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(basicDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/example/test2/mpr/*.xml"));
return factoryBean.getObject();
}
}
为了表示区别我两个数据库里创建的两个不同表,即:
test1 中 User表
test2 中 Role表
使用方式
使用调用时就和单数据源调用方式一样。需要注意的地方就是如果两个表名和实体名称相似时不能搞错。
{//对数据源test1插入数据
UserCreateRequest userCreateRequest = new UserCreateRequest();
userCreateRequest.setName("AAA");
userCreateRequest.setType("AAA");
UserCreateResponse userCreateResponse = userManager.create(userCreateRequest, token);
System.out.println(MapperUtil.toJson(userCreateResponse));
}
{//对数据源test2插入数据
RoleCreateRequest roleCreateRequest = new RoleCreateRequest();
roleCreateRequest.setRoleName("BBB");
RoleCreateResponse roleCreateResponse = roleManager.create(roleCreateRequest, token);
System.out.println(MapperUtil.toJson(roleCreateResponse));
}
效果如下:
数据分别插入了各自的数据库下。