在开发中常常会遇到一个程序须要调用多个数据库的状况,总得来讲分为下面的几种状况:java
下面针对第一种状况,提供一个解决方案。mysql
由于两个数据库的功能和结构不同,因此能够根据功能和结构把DAO分为两个package。而后再mapperscan中指定不一样的package对接不一样的数据源,便可达到多个数据源的共存。spring
spring: datasource: emanage: url: jdbc:mysql://127.0.0.1:3306/emanage?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&useAffectedRows=true username: root password: ****** driver-class-name: com.mysql.cj.jdbc.Driver ehr: url: jdbc:mysql://127.0.0.1:3306/ehr?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&useAffectedRows=true username: root password: ******** driver-class-name: com.mysql.cj.jdbc.Driver
为了避免必要的干扰,我把druid数据源的配置部分给删除了。sql
@Configuration @MapperScan(basePackages = {"com.emanage.ehr.mapper.emanage"},sqlSessionTemplateRef = "sqlTemplate1") public class DataSourceConfig1 { @Bean(name = "datasource1") @ConfigurationProperties(prefix = "spring.datasource.emanage") public DruidDataSource druidDataSource1() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "sqlFactory1") public SqlSessionFactory sqlSessionFactory(@Qualifier("datasource1") DruidDataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/emanage/**Mapper.xml")); return factoryBean.getObject(); } @Bean(name = "sqlTemplate1") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlFactory1") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
@Configuration @MapperScan(basePackages = {"com.emanage.ehr.mapper.ehr"},sqlSessionTemplateRef = "sqlTemplate2") public class DataSourceConfig2 { @Bean(name = "datasource2") @ConfigurationProperties(prefix = "spring.datasource.ehr") public DataSource druidDataSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "sqlFactory2") public SqlSessionFactory sqlSessionFactory(@Qualifier("datasource2") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/ehr/**Mapper.xml")); return factoryBean.getObject(); } @Bean(name = "sqlTemplate2") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlFactory2") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
两个datasource的配置基本上同样。就是创建datasource,sqlsessionFactory,sqlSessionTemplate的注入。而后经过mapperscan来指定具体什么包采用什么数据源。而后再对应包里就和之前单数据源同样操做便可。数据库
若是用myBatis, SqlSessionFactory 部分可使用SqlSessionFactoryBean来生成。可是若是用mybatis plus必定要用MybatisSqlSessionFactoryBean 来生成SqlSessionFactory。不然会报错 ,没法直接经过BaseMapper去调用查询。
若是要再不一样的包中混合上XML进行调用。须要在SqlSessionFactory的配置中设置factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/ehr/**Mapper.xml"));session
优势:
简单,经过简单的设置。就能够知足大多数的状况。数据结构
那么问题来了:若是要在一个package下面,想调用哪一个就调用哪一个数据源怎么办呢?有时间了,下一篇文章写写另外的实现方式。mybatis
但愿对初学者有价值,若是有疑问欢迎留言交流。app