springboot2.x集成mybatis连接多数据源 1、引入依赖 2、配置文件配置数据源 3、查看项目结构 4、配置主数据源 5、配置从数据源(可有多个从数据源) 6、 测试从不同数据源获取不同数据库里面的数据

有时候项目处理的数据的时候数据都存在不同的数据库里面,这个时候就需要我们自己配置其他的数据源了,这里我使用的是Spring boot2.3.7的版本

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>
 
<!-- 阿里巴巴连接驱动 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.13</version>
</dependency>

2、配置文件配置数据源

#数据源配置
#连接池的类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#连接驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#主数据库
spring.datasource.url=jdbc:mysql://ip:端口/数据库名?serverTimezone=Asia/Shanghai
spring.datasource.username=xxx
spring.datasource.password=xxx
#从数据库(可以有多个从数据源)
spring.datasource.druid.slave.url=jdbc:mysql://ip:端口/数据库名?serverTimezone=Asia/Shanghai
spring.datasource.druid.slave.username=xxx
spring.datasource.druid.slave.password=xxx
#初始大小
spring.datasource.druid.initial-size=1
#最大连接数
spring.datasource.druid.max-active=100
#最小空闲连接数
spring.datasource.druid.min-idle=10
#配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
spring.datasource.druid.default-auto-commit=true
#每个连接大小的MAX池准备
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

3、查看项目结构

springboot2.x集成mybatis连接多数据源
1、引入依赖
2、配置文件配置数据源
3、查看项目结构
4、配置主数据源
5、配置从数据源(可有多个从数据源)
6、 测试从不同数据源获取不同数据库里面的数据

4、配置主数据源

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
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.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @Author qt
 * @Date 2021/3/10
 * @Description 配置主数据源
 */

@Configuration
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
    static final String PACKAGE = "com.xxx.xxx.dao.master";
    static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";

    @ConfigurationProperties("spring.datasource.druid.master")
    @Bean(name = "masterDataSource")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "masterTransactionManager")
    @Primary //设置主数据库
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary //设置主数据库
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

}

5、配置从数据源(可有多个从数据源)

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
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.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @Author qt
 * @Date 2021/3/10
 * @Description 从数据源配置
 */

@Configuration
@MapperScan(basePackages = SlaveDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {
    static final String PACKAGE = "com.xxx.xxx.dao.slave";
    static final String MAPPER_LOCATION = "classpath:mapper/slave/*.xml";

    @ConfigurationProperties("spring.datasource.druid.slave")
    @Bean(name = "slaveDataSource")
    public DataSource slaveDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager() {
        return new DataSourceTransactionManager(slaveDataSource());
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource slaveDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(slaveDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(SlaveDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

6、 测试从不同数据源获取不同数据库里面的数据

@Resource
private UserMasterDao userMasterDao;
@Resource
private UserSlaveDao userSlaveDao;

@Test
public void mainTest() {
  User userMaster = userMasterDao.getMasterUserById("456");
  System.out.println("主数据库===>:" + JSON.toJSONString(userMaster));
  User userSlave = userSlaveDao.getSlaveUserById("123");
  System.out.println("从数据库===>:" + JSON.toJSONString(userSlave));
}

总结:实践是检验真理的唯一标准,亲测可用。

参考:https://www.pianshen.com/article/7085261564/