一、背景
一般情况下,我们的系统框架都是连接一个数据库,然后多个表就可以满足需求。但是由于项目需要连接两个数据库,所以今天就总结下 sprigboot2.x + mybatis 连接两个数据源,如果两个数据源都会了,那么你多个数据源也就会了。
今天查了大量的资料,网上大多数的博客都是基于 springBoot1.x,而 2.x 和 1.x 版本的差别还是蛮大的。有好多的配置问题,踩了好多的坑。
二、操作方式
2.1 配置数据源
首先在 application.properties 里面配置两个数据源,如下所示:
# 注释掉所有关于mybatis的配置
#mybatis.config-location=classpath:mybatis/mybatis-config.xml
#mybatis.mapper-locations=classpath:mybatis/*/*.xml
# 本地库的数据源
spring.datasource.epss.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.epss.url=jdbc:mysql://localhost:3306/zlits_epss?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.epss.username=root
spring.datasource.epss.password=123456
spring.datasource.epss.type=com.alibaba.druid.pool.DruidDataSource
# 六合一下发库数据源
spring.datasource.library.url=jdbc:mysql://localhost:3306/qzk_dzcp_hj22?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.library.username=root
spring.datasource.library.password=123456
spring.datasource.library.type=com.alibaba.druid.pool.DruidDataSource
2.2 配置主从数据源
配置主数据源,如下
@Configuration
@MapperScan(value = {"com.zit.cac.dao","com.zit.epms.dao"}, sqlSessionFactoryRef = "epssSessionFactory")
public class EpssDataSourceConfig {
@Value("${spring.datasource.epss.type}")
private Class<? extends DataSource> dataSourceType;
// @Primary 表示指定这是主数据源
@Primary
@Bean("epssDataSourceProperties")
@ConfigurationProperties("spring.datasource.epss")
public DataSourceProperties epssDataSourceProperties() {
return new DataSourceProperties();
}
@Primary
@Bean(name = "epssDataSource")
public DataSource epssDataSource(@Qualifier("epssDataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().type(dataSourceType).build();
}
@Primary
@Bean(name = "epssSessionFactory")
public SqlSessionFactory epssSessionFactory(@Qualifier("epssDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.
getResources("classpath*:/mybatis/inside/*/*.xml"));
}
@Primary
@Bean(name = "epssTransactionManager")
public DataSourceTransactionManager epssTransactionManager(@Qualifier("epssDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "epssSqlSessionTemplate")
public SqlSessionTemplate epssSqlSessionTemplate(@Qualifier("epssSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
配置从数据源,如下
@Configuration
@MapperScan(value = "com.zit.library.dao", sqlSessionFactoryRef = "librarySessionFactory")
public class LibraryDataSourceConfig {
@Value("${spring.datasource.library.type}")
private Class<? extends DataSource> dataSourceType;
@Bean("libraryDataSourceProperties")
@ConfigurationProperties("spring.datasource.library")
public DataSourceProperties libraryDataSourceProperties() {
return new DataSourceProperties();
}
@Bean("libraryDataSource")
public DataSource libraryDataSource(@Qualifier("libraryDataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().type(dataSourceType).build();
}
@Bean("librarySessionFactory")
public SqlSessionFactory librarySessionFactory(@Qualifier("libraryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mybatis/external/*/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "libraryTransactionManager")
public DataSourceTransactionManager libraryTransactionManager(@Qualifier("libraryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "librarySqlSessionTemplate")
public SqlSessionTemplate librarySqlSessionTemplate(@Qualifier("librarySessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
2.3 代码结构
mapper.xml 所在的目录结构如图所示
三、总结
1、SpringApplication 类无需再配置 (exclude = DataSourceAutoConfiguration.class), 这个在 1.0 中是必须的,如果不 exclude,会导致你的自定义数据源不生效。
2、通过 @Configuration 创建数据源配置类后,可以单独指定 MapperScan,但此时需要注意把 SpringApplication 的 @ComponentScan 去掉,如果不去掉,则这个配置类不会生效或发送相关错误。
3、需要指定 mapper 文件所在的径 bean.setMapperLocations(resolver.getResources("classpath*:/mybatis/inside/*/*.xml"))
4、如果你发现有一些博客是这样配置 application.properties 配置文件的,如图所示,那么你在配置主从数据源的时候,就得按照我下面这种方式配置 dataSource。主要原因还是引用的类不同,写法也就不一样。