操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL。在SpringBoot中,配置多数据源的方式十分便捷。


文章目录

  • 一、pom依赖配置
  • 二、application.yml 配置
  • 三、Java config配置


一、pom依赖配置

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.2.0</version>
</dependency>
 
<!-- MySQL 连接驱动依赖 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.48</version>
</dependency>

二、application.yml 配置

spring:
  datasource:
    user:
      jdbc-url: jdbc:mysql://111.222.213.88:3306/house1?useUnicode=true&characterEncoding=utf-8
      username: root
      password: pass
    data-cloud:
      jdbc-url: jdbc:mysql://111.222.213.99:3306/house2?useUnicode=true&characterEncoding=utf-8
      username: root
      password: pass


mybatis:
  mapper-locations: classpath:/mapper/*.xml

三、Java config配置

1、配置数据源一:
UserDBProperties 读取配置

@Component
@ConfigurationProperties(prefix = "spring.datasource.user")
@Data
public class UserDBProperties {
    private String jdbcUrl;
    private String username;
    private String password;
}

UserDBConfig:

import com.ytx.data.initialization.properties.UserDBProperties;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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;

@Configuration
@MapperScan(basePackages = "com.ytx.data.dao.user", sqlSessionTemplateRef = "userSqlSessionTemplate")
public class UserDBConfig {

    @Autowired
    private UserDBProperties properties;


    @Bean("userDataSource")
    @Primary
    public HikariDataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(properties.getJdbcUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        dataSource.setConnectionInitSql("SET NAMES utf8mb4");
        return dataSource;
    }

    @Bean("userSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/user/*Mapper.xml"));
        return sessionFactory.getObject();
    }

    @Bean("userTransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("userDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("userSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

2、配置数据源二:
DataCloudDBProperties读取配置

@Component
@ConfigurationProperties(prefix = "spring.datasource.data-cloud")
@Data
public class DataCloudDBProperties {
    private String jdbcUrl;
    private String username;
    private String password;
}

DataCloudDBConfig:

import com.ytx.data.initialization.properties.DataCloudDBProperties;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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;

@Configuration
@MapperScan(basePackages = "com.ytx.data.dao.dataCloud", sqlSessionTemplateRef = "dataCloudSqlSessionTemplate")
public class DataCloudDBConfig {

    @Autowired
    private DataCloudDBProperties properties;

    @Bean("dataCloudDataSource")
    public HikariDataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(properties.getJdbcUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        dataSource.setConnectionInitSql("SET NAMES utf8mb4");
        return dataSource;
    }

    @Bean("dataCloudSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataCloudDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/dataCloud/*Mapper.xml"));
        return sessionFactory.getObject();
    }

    @Bean("dataCloudTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("dataCloudDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("dataCloudSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("dataCloudSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

其中将@MapperScan(basePackages = “com.ytx.data.dao.dataCloud”, sqlSessionTemplateRef = “dataCloudSqlSessionTemplate”)的值换成操作数据源相对应mapper的包位置。

SpringBoot+mybatis连接多数据库配置模版_Source


sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(“classpath:mapper/dataCloud/*Mapper.xml”));修改成数据源对于的mapper.xml文件对应的位置即可。

SpringBoot+mybatis连接多数据库配置模版_spring boot_02