SpringBoot+MyBatis多数据源实战指南
·
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 动态数据源(灵活切换)。
更多推荐

所有评论(0)