Spring Boot + MyBatis-Plus 多数据源配置,常见的需求就是一个项目里同时访问不同的数据库(例如 MySQL + PostgreSQL,或者主库 + 从库),并且在代码里能区分不同的数据源。

下面是一个完整的示例,包含 application.yml 配置、多数据源的 DataSourceConfig、以及如何在 MyBatis-Plus 里使用。


1. application.yml 配置多个数据源

spring:
  datasource:
    master:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db_master?useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: 123456
    slave:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db_slave?useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: 123456

2. 定义数据源配置类

使用 @MapperScan 分别指定不同包下的 Mapper,绑定到不同的数据源。

@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {

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

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "masterSqlSessionTemplate")
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {

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

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

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

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3. 项目结构示例

com.example.demo
 ├─ mapper
 │   ├─ master
 │   │    └─ MasterUserMapper.java
 │   └─ slave
 │        └─ SlaveOrderMapper.java
 ├─ entity
 │   ├─ MasterUser.java
 │   └─ SlaveOrder.java
 └─ service
     ├─ MasterUserService.java
     └─ SlaveOrderService.java

4. 使用方式

比如:

@Service
public class UserService {
    @Resource
    private MasterUserMapper masterUserMapper;

    @Resource
    private SlaveOrderMapper slaveOrderMapper;

    public MasterUser getUser(Long id) {
        return masterUserMapper.selectById(id); // 主库
    }

    public SlaveOrder getOrder(Long id) {
        return slaveOrderMapper.selectById(id); // 从库
    }
}

5. 可选:动态数据源(更灵活)

如果你希望在运行时动态切换数据源(而不是固定 Mapper 对应某个库),推荐用 MyBatis-Plus Dynamic Datasource

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>4.3.1</version>
</dependency>

application.yml:

spring:
  datasource:
    dynamic:
      primary: master
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/db_master
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3306/db_slave
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver

切换方式:

@Service
public class TestService {
    @DS("master")
    public User getUser(Long id) {
        return userMapper.selectById(id);
    }

    @DS("slave")
    public Order getOrder(Long id) {
        return orderMapper.selectById(id);
    }
}

要么用 多个配置类 + MapperScan(适合两个数据库固定分工),要么用 MyBatis-Plus 动态数据源(灵活切换)。

更多推荐