最近项目中遇到需要在一个project里面配置多个数据库也就是配置多个数据源的情况,在一个系统比较大且功能比较全面的情况下 使用单一数据源是几乎不可能的,比如说淘宝 【笑哭】 为方便以后查看做下记录 也和小伙伴们分享一下 如有问题还请不吝赐教!!!
- 目录结构
简单说明
- application.yml 文件里面配置是的是数据库的一些基本信息,数据库ip地址、用户名、密码等以及一些连接池的配置
- config包下的DatasourceConfig 配置的是数据源和master和follow的key
- mybatisConfig 是配置数据源的调用 mapper包下的文件和对应的xml文件
- 数据库配置如下:
application.yml
#启动器的编码设置
server:
tomcat:
uri-encoding: UTF-8
#SpringMVC相关配置
datasource1:
url: jdbc:mysql://localhost:3306/convergedmediainteract?useSSL=false&useUnicode=true
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root12
datasource2:
url: jdbc:mysql://localhost:3306/convergedmediavote?useSSL=false&useUnicode=true
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root12
- 数据源配置key的配置类
DataSourceConfig.java
package tide.jstv.operationdata.config;
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;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean(name = "dbOneDataSource")
@Primary
@ConfigurationProperties(prefix = "datasource1") // application.properteis中对应属性的前缀
public DataSource dbOneDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dbTwoDataSource")
@ConfigurationProperties(prefix = "datasource2") // application.properteis中对应属性的前缀
public DataSource dbTwoDataSource() {
return DataSourceBuilder.create().build();
}
}
MybatisConfig
package tide.jstv.operationdata.config;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.annotation.Resource;
import javax.sql.DataSource;
public class MybatisConfig {
@Configuration
@MapperScan(basePackages = {"tide.jstv.operationdata.mapper.vote"},
sqlSessionFactoryRef = "sqlSessionFactoryTwo",
sqlSessionTemplateRef ="sqlSessionTemplateTwo" )
public static class DBTwo{
@Resource
DataSource dbTwoDataSource;
@Bean
public SqlSessionFactory sqlSessionFactoryTwo() throws Exception {
System.out.println("主配");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dbTwoDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/vote/*.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplateTwo() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryTwo()); // 使用上面配置的Factory
return template;
}
}
@Configuration
@MapperScan(basePackages = {"tide.jstv.operationdata.mapper.interact"},
sqlSessionFactoryRef = "sqlSessionFactoryOne",
sqlSessionTemplateRef = "sqlSessionTemplateOne")
public static class DBOne{
@Resource
DataSource dbOneDataSource;
@Bean
public SqlSessionFactory sqlSessionFactoryOne() throws Exception {
System.out.println("主配");
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dbOneDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/interact/*/*.xml"));
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryOne()); // 使用上面配置的Factory
return template;
}
}
}
到这里就就算配置完成了,不过要注意Springboot版本 2.0以上不支持这种配置 在调数据库时会报错
出现 jdbcUrl is required with driverClassName的错误
这是我项目中的版本 ,如果遇到以上报错的童鞋 可以将springboot版本改为此版本将不会报错