springboot mybatis plus多数据源轻松搞定 (上)

在开发中常常会遇到一个程序须要调用多个数据库的状况,总得来讲分为下面的几种状况:java

  1. 一个程序会调用不一样结构的两个数据库。
  2. 读写分离,两个数据结构可能同样高,可是不一样的操做针对不一样的数据库。
  3. 混合状况,既有不一样的结构的数据库,也可能存在读写分离的状况。

下面针对第一种状况,提供一个解决方案。mysql

解决思路

由于两个数据库的功能和结构不同,因此能够根据功能和结构把DAO分为两个package。而后再mapperscan中指定不一样的package对接不一样的数据源,便可达到多个数据源的共存。spring

配置yml中的数据源设置

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

创建两个datasource的配置

datasource1的 配置

@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);
    }
}

datasource2的配置

@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能够分来的方式来调用,不能灵活的在一个package下面为所欲为的调用数据源。

那么问题来了:若是要在一个package下面,想调用哪一个就调用哪一个数据源怎么办呢?有时间了,下一篇文章写写另外的实现方式。mybatis

但愿对初学者有价值,若是有疑问欢迎留言交流。app

相关文章
相关标签/搜索