最近由于項目中需要同時連接兩個數(shù)據(jù)庫,所以需要配置多個數(shù)據(jù)源,由于springboot 默認(rèn)幫我們做了很多自動配置,所以在配置的時候就遇到了問,稍后我們會討論這個問題。
項目依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
數(shù)據(jù)庫不同源配置文件
master連接的是test庫,slave連接的是haozi,這里的命名并沒有主從關(guān)系,只是為了區(qū)分
datasource.master.url=jdbc:mysql://127.0.0.1:3306/test
datasource.master.driverClassName=com.mysql.jdbc.Driver
datasource.master.username=root
datasource.master.password=
datasource.slave.url=jdbc:mysql://127.0.0.1:3306/haozi
datasource.slave.driverClassName=com.mysql.jdbc.Driver
datasource.slave.username=root
datasource.slave.password=
Master Mybatis配置
@Configuration
@MapperScan(basePackages = "com.example.mapper.master",sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties("datasource.master")
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/master/*.xml"));
return sessionFactoryBean.getObject();
}
}
Slave Mybatis配置
@Configuration
@MapperScan(basePackages = "com.example.mapper.slave",sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveSourceConfig {
@Bean(name = "slaveDataSource")
@ConfigurationProperties("datasource.slave")
public DataSource slaveDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/slave/*.xml"));
return sessionFactoryBean.getObject();
}
}
結(jié)構(gòu)圖及對應(yīng)關(guān)系分析

structure1.png
這里的mapper目錄下的master和slave主要存放的是mapper接口,被上面的DataSourceConfig上的@MapperScan注解所燒面,這里面我把master和slave的mapper接口放在不同的子目錄下了。

structure1.png
這里分別放的是和上面mapper接口對應(yīng)的.xml文件,被上面的配置來掃描,然后通過setMapperLocations注冊到SqlSessionFactory中。
可能遇到的問題
- mybatis required a single bean, but 2 were found
這是因我們這里配置了兩個數(shù)據(jù)源,springboot會自動的注入,但是注入的時候發(fā)現(xiàn)有兩個,所以不知道選擇哪一個了,因為我們要關(guān)閉springboot關(guān)于mybatis的一些自動注入,在@SpringBootApplication注解下面,加入一個@EnableAutoConfiguration(exclude=""),具體如下:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
第一個是數(shù)據(jù)源,第二個是數(shù)據(jù)源的事務(wù)管理器,第三個是和SessionFactory相關(guān)的。