SpringBoot + mybatis配置多数据源

本文详细介绍了在SpringBoot项目中配置两个数据源(MySQL和Oracle)的方法,包括YAML文件中的配置以及使用JavaConfig自定义DataSource。还涉及到了MyBatis和MyBatis-Plus的集成。
摘要由CSDN通过智能技术生成

在项目中遇到了需要配置多个数据库源的情况,这里简要记录一下如何进行配置。

通过网上的搜索主要参考springboot官方文档双数据源配置进行了配置。

一、YAML配置

首先,需要在application.yaml文件中配置数据源,首先看一下但数据源的配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
    username: test
    password: test

对于多数据源,我们需要在datasource下分别为其分配别名进行配置

spring:
  datasource:
    primary: 
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
      username: test
      password: test
      type: com.zaxxer.hikari.HikariDataSource
      hikari: 
        pool-name: HikariCP-Primary
        mininum-idle: 5
        idle_timeout: 600000
        maxinum-pool-size: 15
        auto-commit: true
        max-lifetime: 1200000
        connection-timeout: 30000
        connection-test-query: SELECT 1 FROM DUAL
    second: 
      driver-class-name: oracle.jdbc.OracleDriver
      url: jdbc:oracle:thin:@//localhost:1521/test
      username: test
      password: test
      type: com.zaxxer.hikari.HikariDataSource
      hikari: 
        pool-name: HikariCP-Second
        mininum-idle: 5
        idle_timeout: 600000
        maxinum-pool-size: 10
        auto-commit: true
        max-lifetime: 1200000
        connection-timeout: 30000
        connection-test-query: SELECT 1 FROM DUAL

这里设置了两个数据源,其中primary为MySQL,second为Oracle

二、java config配置

我们可以对两个数据源写两个java config分别进行设置

1. PrimaryDataSourceConfig.java
package com.iflytek.cga.estimate.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @Description 主要数据源配置
 */
@Configuration
@MapperScan(basePackages = "com.xxx.xxx.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
    /**
     * 指定mapper xml文件路径
     */
    public static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.primary")
    public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean("primaryDataSource")
    @Qualifier(value = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary.hikari")
    public HikariDataSource primaryDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Primary
    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        final MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(PrimaryDataSourceConfig.MAPPER_LOCATION));
        return sessionFactoryBean.getObject();
    }

}
2. SecondDataSourceConfig.java
package com.iflytek.cga.estimate.config;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * second数据源配置
 */
@Configuration
@MapperScan(basePackages = "com.xxx.xxx.second.mapper", sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {
    /**
     * 指定mapper xml文件路径
     */
    public static final String MAPPER_LOCATION = "classpath:oracle/mapper/*.xml";

    @Bean
    @ConfigurationProperties("spring.datasource.second")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean("secondDataSource")
    @Qualifier(value = "secondDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.second.hikari")
    public HikariDataSource secondDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
        final MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(SecondDataSourceConfig.MAPPER_LOCATION));
        return sessionFactoryBean.getObject();
    }
}

这里需要注意的地方有以下几处:

首先对DataSource进行配置时,需要使用@Primary或者@Qualifier区分相同类型的Bean;

其次,不同数据源的mapper将其放入不同路径的包内,然后通过@MapperScan去扫描对应的包,即不同的包对应不同的数据源;

最后如果需要使用mybatis-plus,需要将SqlSessionFactory配置成MybatisSqlSessionFactoryBean进行返回,否则只能写xml文件来实现数据库的CRUD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值