配置文件 application-dev.yml
spring:
datasource:
db1:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://xxxxxx:3306/guess?useUnicode=true&characterEncoding=utf8
username: root
password: 91wangjing.com
db2:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://xxxxxx:3306/guess?useUnicode=true&characterEncoding=utf8
username: readone
password: op@0118.
数据源1配置文件
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.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;
/**
* 数据源配置 1
* @author Yan
*
*/
@Configuration
@MapperScan(value = { "cn.wolfcode.mapper.reader" }, sqlSessionTemplateRef = "sqlSessionTemplate1")
public class ReadDataSourceConfig {
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.db1")
@Primary //配置主数据库
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory1")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//读的myBatis配置文件位置
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/reader/*.xml"));
return bean.getObject();
}
@Bean(name = "transactionManager1")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("dataSource1") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate1")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
数据源2配置文件
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.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;
/**
* 数据源配置 2
* @author Yan
**/
@Configuration
@MapperScan(value = { "cn.wolfcode.mapper.writer" }, sqlSessionTemplateRef = "sqlSessionTemplate2")
public class WriterDataSourceConfig{
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/writer/*.xml"));
return bean.getObject();
}
@Bean(name = "transactionManager2")
public DataSourceTransactionManager testTransactionManager(@Qualifier("dataSource2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate2")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
在resources下新建两个数据源的xml放置文件夹,这里我以reader和writer命名方便区分
分别指定xml文件namespace对应的Dao
//数据源1
<mapper namespace="cn.wolfcode.mapper.reader.ReadUserDao">
//数据源2
<mapper namespace="cn.wolfcode.mapper.writer.WriterUserDao">
最后,引入对应的Dao测试即可
@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest {
@Autowired
private ReadUserDao readUserDao;
@Autowired
private WriterUserDao writerUserDao;
@Test
public void test222(){
UserDO readUser = readUserDao.get(1);
System.out.println(readUser);
UserDO writerUser = writerUserDao.get(1);
System.out.println(writerUser);
}
}
测试的时候可能会遇到 jdbcUrl is required with driverClassName的错误,在升级到Spring Boot 2.0后,一些配置及用法有了变化,这里提供一种较简单的方法
在配置文件中使用spring.datasource.jdbc-url,而不是通常使用的spring.datasource.url。