Spring Boot + Mybatis 多数据源整合(方式一)

今天公司需要将数据库中的一部分数据库表迁移到另外一个数据库,而我负责的项目需要操作在该更改下需要操作两个数据库。

1. 思路分析

  • 单个数据库我们需要一个 DataSource,而 Mybatis 中一个 SqlSessionFactory 对象中只存有一个DataSource 的引用。那么就有两个方案
  1. 创建两个 SqlSessionFactory 对象。
  2. 动态切换数据源

这篇博客记录一下方式一。

2. 环境准备

	1. spring-boot-starter-web
	2. spring-boot-starter-test
	3. mysql-connector-java
	4. mybatis-spring-boot-starter
	5. druid 

(*注意:spring-boot 的依赖版本号需要对应)

3. yaml 配置多个数据源

spring:
  datasource:
    source1:
      driverClassName: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      jdbcUrl: jdbc:mysql://localhost:3306/order_system?useSSL=false&characterEncoding=UTF8
      username: root
      password: root
    source2:
      driverClassName: com.mysql.cj.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
      jdbcUrl: jdbc:mysql://localhost:3306/order_system2?useSSL=false&characterEncoding=UTF8
      username: root
      password: root

3.两个数据源的自定义配置

source1的配置:


@Configuration
@MapperScan(basePackages = "com.test.power.mapper.source1", sqlSessionTemplateRef = "source1SqlSessionTemplate")
public class LdgDataSourceConfig {


    private static String MAPPER_LOCATIONS = "classpath:com/test/power/mapper/source1/*.xml";



    @Bean(name = "source1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.source1")
    @Primary
    public DataSource ldgDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "source1SqlSessionFactory")
    public SqlSessionFactory ldgSqlSessionFactory(@Qualifier("source1DataSource")DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATIONS));
        return bean.getObject();
    }

    @Bean(name = "source1TransactionManager")
    public DataSourceTransactionManager ldgTransactionManager(@Qualifier("source1DataSource")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "source1SqlSessionTemplate")
    public SqlSessionTemplate ldgSqlSessionTemplate(@Qualifier("source1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

source2的配置:

@Configuration
@MapperScan(basePackages = "com.test.power.mapper.source2", sqlSessionTemplateRef = "source2SqlSessionTemplate")
public class QldDataSourceConfig {

    @Bean(name = "source2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.source2")
    @Primary
    public DataSource source2DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "source2SqlSessionFactory")
    public SqlSessionFactory source2SqlSessionFactory(@Qualifier("source2DataSource")DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/test/power/mapper/source2/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "source2TransactionManager")
    public DataSourceTransactionManager source2TransactionManager(@Qualifier("source2DataSource")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("source2SqlSessionTemplate")
    public SqlSessionTemplate source2SqlSessionTemplate(@Qualifier("source2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

4.编写 DAO 层

根据数据源的配置类,MapperScan 扫描的包下编写接口,MAPPER_LOCATIONS 对应的包下编写“ *Mapper.xml” 。此处省略…

5. 编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyBatisApplication.class)
public class TestMybatisApplication {

    @Autowired
    private Source1CategoryMapper source1CategoryMapper;
    private Source2CategoryMapper source2CategoryMapper;

    /**
     * 用于测试:多数据源查询数据库
     */
    @Test
    public void test() {
        source1CategoryMapper.selectByPrimaryKey(5);
        source2CategoryMapper.selectByPrimaryKey(5)
    }
}

6. 结果

执行结果

7. 引发提问

  • 若不只是简单的查,在之前配置自定义数据源时,有配置事务管理器,该案例中有两个事务管理器,多数据源操作,事务该如何有效控制?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值