mybatis多数据源配置_SpringBoot整合多数据源配置实战

点击蓝色“今日Java”关注我哟

加个“星标”,不迷路哦

f2373bb068a8b2d0b00ef40cacb32fad.png

来源 | blog.csdn.net/fire_100/article/details/109469666整理 | 麦叔

近期在处理项目整合的task,涉及到多数据源配置,现将具体实践分享给大家。

配置多数据源

1.application.yml配置

first:
  datasource:
    password: *****
    url: *****
    username: *****
second:
  datasource:
    password: *****
    url: *****
    username: *****
12345678910

2.数据源配置类

项目结构如下:909f5758adda49c87a0cb6028e5bed26.png)

@Configuration
@MapperScan(basePackages = FirstDataSourceConfig.MAPPER_PACKAGE, sqlSessionFactoryRef = "firstSqlSessionFactory")
public class FirstDataSourceConfig {

    static final String MAPPER_PACKAGE = "***.mapper.first";
    private static final String MAPPER_LOCATION = "classpath:mapper/first/*.xml";

    @Bean(value = "firstDataSource")
    @ConfigurationProperties(prefix = "first.datasource")
    public DataSource dataSourceManager() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "firstTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("firstDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "firstSqlSessionFactory")
    public SqlSessionFactory firstSqlSessionFactory1(@Qualifier("firstDataSource") DataSource dataSource)throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setConfigLocation(resolver.getResource(Constants.MYBATIS_CONFIG_PATH));
        sessionFactory.setMapperLocations(resolver.getResources(MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}
1234567891011121314151617181920212223242526272829
@Configuration
@MapperScan(basePackages = SecondDataSourceConfig.MAPPER_PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {

    static final String MAPPER_PACKAGE = "***.mapper.second";
    private static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml";

    @Bean(value = "secondDataSource")
    @ConfigurationProperties(prefix = "second.datasource")
    public DataSource dataSourceManager() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("secondDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory secondSqlSessionFactory2(@Qualifier("secondDataSource") DataSource dataSource)throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setConfigLocation(resolver.getResource(Constants.MYBATIS_CONFIG_PATH));
        sessionFactory.setMapperLocations(resolver.getResources(MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}
1234567891011121314151617181920212223242526272829
MapperScan注解定义了持久层的扫包范围,并且指定这个包配置的是哪个数据源。
@ConfigurationProperties(prefix = "xxx.xxx")可以依靠指定的前缀,使用application.yml中指定数据源的配置。
sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(Constants.MYBATIS_CONFIG_PATH)): 自定义数据源不会自动加载MybatisAutoConfiguration.java这个配置类里面的sqlSessionFactory,也就不会自动加载mybatis-config.xml配置文件,需手动加载。
事务处理:@Transactional(rollbackFor = Exception.class, transactionManager = "firstTransactionManager")
1234

3.demo测试

@RunWith(SpringRunner.class)
@Slf4j
@SpringBootTestpublic class DataSourceTest {

    @Resource
    private KnowledgeRecordMapper knowledgeRecordMapper;
    @Resource
    private CourseUnitMapper courseUnitMapper;

    @Test
    public void dataSourceTest() throws Exception {
     //数据来自于first数据源
        DocumentRecordItem item = knowledgeRecordMapper.getDocumentRecordById(13439l);
        if (Objects.isNull(item)) {
            return;
        }
        log.info("documentRecord: {}", item.toString());

  //数据来自于second数据源
        List unitIds = Arrays.asList(552l, 1268l);
        List list = courseUnitMapper.getUnitKnowledgeExaminedStatusFromResult(unitIds);if (CollectionUtils.isEmpty(list)) {return;
        }
        log.info("list: {}", list);
    }
}12345678910111213141516171819202122232425262728

结果如下:

2020-11-03 14:26:00,246000 [INFO] [] [] main DruidDataSource.java:init:1003 - {dataSource-1} inited
2020-11-03 14:26:00,852000 [INFO] [] [] main DataSourceTest.java:dataSourceTest:39 - documentRecord: {"ctime":1575023698000,"documentName":"1575023700097.xlsx","id":13439,"operationDetail":"-","operationType":21,"operatorId":30000302,"operatorName":"***","utime":1575023698000}
2020-11-03 14:26:00,883000 [INFO] [] [] main DruidDataSource.java:init:1003 - {dataSource-2} inited
268ab39901d811c72035a01edfa3e9e4.png

往期推荐

Git提交代码错了吃后悔药的几种常用办法

SpringBoot操作阿里云OSS实现文件上传,下载,删除

Java反射是什么?看这篇绝对会了!

快速学会如何配置Shiro过滤器

d5465538d7a2d8cd5a9e38dd5b2f9d4b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值