本文以 Spring Boot 整合 Mybatis 为基础,在该基础上配置多数据源。

1. 修改配置文件


回顾一下在 Spring Boot 整合 Mybatis 中 application.yml 文件配置:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      ## 数据库连接
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: demo
      password: demo
.......

我们将数据源配置交给 druid 来管理,所以配置多数据源时只需要在 druid 中添加数据源配置即可:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      db1:
        ## 数据库连接
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: demo
        password: demo
      db2:
        ## 数据库连接
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: test
        password: test

这里配置的是在同一个 MySQL 服务下的两个不同的数据库,现实开发中多使用不同的 MySQL 服务中的多个库,道理是一样的。

2. 编写配置类

编写配置类的目的是将数据源配置注册到 Spring IOC 容器中。

DataSourceOneConfig 配置类内容

@Configuration
@MapperScan(basePackages = DataSourceOneConfig.PACKAGE, sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DataSourceOneConfig {

    public static final String PACKAGE = "com.demo.mybatis.mapper";

    public static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.druid.db1")
    public DataSource dataSourceOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("dataSourceOne") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);

//        sqlSessionFactory.setMapperLocations(
//                new PathMatchingResourcePatternResolver().getResources(DataSourceOneConfig.MAPPER_LOCATION));
        return sqlSessionFactory.getObject();
    }

    @Bean
    @Primary
    public DataSourceTransactionManager db1transactionManager() {
        return new DataSourceTransactionManager(dataSourceOne());
    }
}

DataSourceTwoConfig 配置类内容

@Configuration
@MapperScan(basePackages = DataSourceTwoConfig.PACKAGE, sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DataSourceTwoConfig {

    public static final String PACKAGE = "com.demo.mybatis.mapper2";

    public static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Bean
    @ConfigurationProperties("spring.datasource.druid.db2")
    public DataSource dataSourceTwo() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory db2SqlSessionFactory(@Qualifier("dataSourceTwo") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);

//        sqlSessionFactory.setMapperLocations(
//                new PathMatchingResourcePatternResolver().getResources(DataSourceOneConfig.MAPPER_LOCATION));
        return sqlSessionFactory.getObject();
    }

    @Bean
    public DataSourceTransactionManager db2transactionManager() {
        return new DataSourceTransactionManager(dataSourceTwo());
    }
}

@MapperScan 注解用于指定 mapper 接口的扫描路径,sqlSessionFactoryRef 用于指定 mapper 接口实现中使用的 sqlSessionFactory

本项目中使用的是 Mybatis 注解的方式,使用 XML 文件的方式需要打开注释的两行代码,以开启 mapper.xml 文件扫描路径。

后记

测试内容这里就不赘述了,与单数据源的使用方式一致。

当前这个多数据源的配置是最为简陋的配置方式,仅仅只有学习和参考价值。因为每多配置一个数据源,我们就需要多编写一个配置类,那么本着 DRY 原则,这种方式在实际开发环境中肯定是不可取的。相信很多同学这个时候已经想到了使用 设计模式 来解决这个问题。

关于 设计模式 的问题这里就不做展开了,有兴趣的可以基于我们这个项目进行一下改版。

源码地址:https://github.com/NekoChips/SpringDemo/tree/master/02.springboot-mybatis


关于作者:NekoChips
本文地址:https://chenyangjie.com.cn/articles/2020/04/26/1587870133056.html
版权声明:本篇所有文章仅用于学习和技术交流,本作品采用 BY-NC-SA 4.0 许可协议,如需转载请注明出处!
许可协议:知识共享许可协议