在Spring Boot中,我们可以通过配置多个数据源来实现多数据源的功能。下面是具体的代码框架、配置类、配置文件和详细步骤说明。
1. 代码框架
- src/main/java
- com.example.demo
- config
- DataSourceConfig.java
- DataSourceType.java
- controller
- UserController.java
- mapper
- user
- User1Mapper.java
- User2Mapper.java
- User3Mapper.java
- model
- User.java
- service
- UserService.java
- impl
- UserServiceImpl.java
- util
- DynamicDataSourceContextHolder.java
- DynamicDataSource.java
- src/main/resources
- application.yml
2. 配置类
2.1 数据源类型枚举类
public enum DataSourceType {
DS1, DS2, DS3
}
2.2 数据源配置类
@Configuration
public class DataSourceConfig {
@Bean(name = "DS1")
@ConfigurationProperties(prefix = "spring.datasource.ds1")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "DS2")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
@Bean(name = "DS3")
@ConfigurationProperties(prefix = "spring.datasource.ds3")
public DataSource dataSource3() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public DynamicDataSource dynamicDataSource(@Qualifier("DS1") DataSource ds1,
@Qualifier("DS2") DataSource ds2,
@Qualifier("DS3") DataSource ds3) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceType.DS1, ds1);
targetDataSources.put(DataSourceType.DS2, ds2);
targetDataSources.put(DataSourceType.DS3, ds3);
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(ds1);
return dynamicDataSource;
}
}
2.3 动态数据源类
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceType();
}
}
2.4 动态数据源上下文
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<DataSourceType> CONTEXT_HOLDER = ThreadLocal.withInitial(() -> DataSourceType.DS1);
public static void setDataSourceType(DataSourceType dataSourceType) {
CONTEXT_HOLDER.set(dataSourceType);
}
public static DataSourceType getDataSourceType() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSourceType() {
CONTEXT_HOLDER.remove();
}
}
3. 配置文件
spring:
datasource:
ds1:
url: jdbc:mysql://localhost:3306/db1
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
ds2:
url: jdbc:mysql://localhost:3306/db2
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
ds3:
url: jdbc:mysql://localhost:3306/db3
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
4. 详细步骤说明
- 在
pom.xml
中添加依赖: -
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
- 创建数据源类型枚举类
DataSourceType
。 - 创建数据源配置类
DataSourceConfig
,在其中定义三个数据源,同时定义一个动态数据源DynamicDataSource
,将三个数据源添加到动态数据源中,并将其中一个数据源设置为默认数据源。 - 创建动态数据源类
DynamicDataSource
,它继承自AbstractRoutingDataSource
,并重写了determineCurrentLookupKey()
方法,该方法返回当前线程使用的数据源类型。 - 创建动态数据源上下文类
DynamicDataSourceContextHolder
,它使用ThreadLocal
来保存当前线程使用的数据源类型。 - 在
UserController
中使用@Autowired
注入UserService
,并调用userService
的方法操作数据库。在UserService
中使用@Autowired
注入三个UserMapper
,并根据不同的数据源类型调用不同的UserMapper
。 - 在需要使用不同数据源的地方,使用
DynamicDataSourceContextHolder.setDataSourceType()
方法设置当前线程使用的数据源类型。
5. 单元测试代码
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserService userService;
@Test
void test() {
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DS1);
userService.addUser(new User("user1"));
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DS2);
userService.addUser(new User("user2"));
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DS3);
userService.addUser(new User("user3"));
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DS1);
List<User> userList1 = userService.getUserList();
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DS2);
List<User> userList2 = userService.getUserList();
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DS3);
List<User> userList3 = userService.getUserList();
System.out.println(userList1);
System.out.println(userList2);
System.out.println(userList3);
}
}
6. 总结
本文介绍了Spring Boot如何整合MySQL多数据源,并提供了代码框架、配置类、配置文件、详细步骤说明和单元测试代码。在实际开发中,可以根据需要增加或删除数据源,只需要在DataSourceConfig
中添加或删除数据源配置即可。