springboot配置多数据源

在很多场景下我们可能需要使用查询多个数据库的数据来组合使用,索性我就将springboot下配置多数据源的方法分享出来

1.多数据源配置

maven配置

<dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>3.3.9</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

 

数据库配置

datasource:
    defaultDb:
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://127.0.0.1:3306/default?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    testDb:
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8&amp
      username: root
      password: 123456
defaultDb默认是主库配置,testDb是从库配置

mapper的位置

 可以看到我为主库和从库在dao.mapper设置了两个文件夹用来存放对应的mapper及mapper.xml文件

主库配置

package com.chinaoly.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import tk.mybatis.spring.mapper.MapperScannerConfigurer;

import javax.sql.DataSource;

/**
 * @author ljh
 * @date 2025/4/28
 */
@Slf4j
@Component
@Order(1)
public class DefaultDbConfigurer {

    /**
     * 读取配置defaultDb库的参数
     */
    @Value("${spring.datasource.defaultDb.url}")
    private String url;

    @Value("${spring.datasource.defaultDb.username}")
    private String username;

    @Value("${spring.datasource.defaultDb.password}")
    private String password;

    @Value("${spring.datasource.defaultDb.driver-class-name}")
    private String driverClass;

    /**
     * @Primary是默认数据源
     * 配置数据源
     */
    @Primary
    @Bean(name = "defaultDb")
    @ConfigurationProperties(prefix = "spring.datasource.defaultDb")
    public DataSource defaultDbDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDriverClassName(driverClass);
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 用于创建 SqlSession 实例的工厂
     */
    @Primary
    @Bean
    public SqlSessionFactory sqlSessionFactoryBeanDefaultDb(@Qualifier("defaultDb") DataSource Db) throws Exception {
        log.info("初始化数据库_defaultDb");
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(Db);

        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        //配置mapper对应xml文件位置
        factory.setMapperLocations(resolver.getResources("classpath*:com/chinaoly/dao/mapper/defaultDb/*.xml"));//扫描xml映射文件路径
        return factory.getObject();
    }

    /**
     * 定义MyBatis的映射扫描
     * 等同于<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     */
    @Primary
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurerDefaultDb() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBeanDefaultDb");
        mapperScannerConfigurer.setBasePackage("com.chinaoly.dao.mapper.defaultDb");
        return mapperScannerConfigurer;
    }

}

从库配置

package com.chinaoly.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import tk.mybatis.spring.mapper.MapperScannerConfigurer;

import javax.sql.DataSource;

/**
 * @author ljh
 * @date 2025/4/24
 */
@Slf4j
@Component
@Order(1)
public class TestDbConfigurer {

    @Value("${spring.datasource.testDb.url}")
    private String url;

    @Value("${spring.datasource.testDb.username}")
    private String username;

    @Value("${spring.datasource.testDb.password}")
    private String password;

    @Value("${spring.datasource.testDb.driver-class-name}")
    private String driverClass;


    @Bean(name = "testDb")
    @ConfigurationProperties(prefix = "spring.datasource.testDb")
    public DataSource testDbDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDriverClassName(driverClass);
        return DruidDataSourceBuilder.create().build();
    }

    /**
     * 用于创建 SqlSession 实例的工厂
     */
    @Bean
    public SqlSessionFactory sqlSessionFactoryBeanTestDb(@Qualifier("testDb") DataSource Db) throws Exception {
        log.info("初始化数据库_testDb");
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(Db);

        //添加xml目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factory.setMapperLocations(resolver.getResources("classpath*:com/chinaoly/dao/mapper/testDb/*.xml"));//扫描xml映射文件路径
        return factory.getObject();
    }


    @Bean
    public MapperScannerConfigurer mapperScannerConfigurerTestDb() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBeanTestDb");
        mapperScannerConfigurer.setBasePackage("com.chinaoly.dao.mapper.testDb");
        return mapperScannerConfigurer;
    }

}

从库其实根主库的配置大差不差,区别主要在于指定默认数据库注解及扫描的mapper文件路径

2.主库和从库测试结果

 



posted @ 2025-04-24 17:41  马革皮  阅读(616)  评论(0)    收藏  举报