druid 多数据源_Springboot+mybatis(plus)+druid多数据源
时间: 2023-09-05 15:13:56 浏览: 161
Springboot+Mybatis+Druid多数据源配置
在Spring Boot项目中使用MyBatis Plus和Druid多数据源的步骤如下:
1. 添加依赖
在`pom.xml`文件中添加以下依赖:
```xml
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
```
2. 配置Druid数据源
在`application.yml`中添加Druid数据源的配置:
```yaml
spring:
datasource:
# 主数据源
druid:
url: jdbc:mysql://localhost:3306/main_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# Druid配置
initialSize: 5
minIdle: 5
maxActive: 20
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1 FROM DUAL
# 从数据源
druid2:
url: jdbc:mysql://localhost:3306/sub_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# Druid配置
initialSize: 5
minIdle: 5
maxActive: 20
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1 FROM DUAL
```
3. 配置MyBatis Plus
在`application.yml`中添加MyBatis Plus的配置:
```yaml
mybatis-plus:
# 主数据源配置
mapper-locations: classpath:mapper/main/*.xml
type-aliases-package: com.example.main.entity
global-config:
db-config:
id-type: auto
field-strategy: not_empty
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 从数据源配置
multi-datasource:
main:
mapper-locations: classpath:mapper/main/*.xml
type-aliases-package: com.example.main.entity
sub:
mapper-locations: classpath:mapper/sub/*.xml
type-aliases-package: com.example.sub.entity
```
4. 配置数据源路由
在`com.example.config`包下创建`DynamicDataSourceConfig`类,用于配置数据源路由:
```java
@Configuration
public class DynamicDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid")
public DataSource mainDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid2")
public DataSource subDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
public DataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>(2);
dataSourceMap.put("main", mainDataSource());
dataSourceMap.put("sub", subDataSource());
// 将主数据源作为默认数据源
dynamicDataSource.setDefaultTargetDataSource(mainDataSource());
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource());
sqlSessionFactoryBean.setTypeAliasesPackage("com.example.main.entity");
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/main/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
}
```
5. 配置数据源切换
在`com.example.config`包下创建`DynamicDataSource`类,用于实现数据源切换:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSource();
}
}
```
在`com.example.config`包下创建`DataSourceContextHolder`类,用于存储当前数据源:
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> DATASOURCE_CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
DATASOURCE_CONTEXT_HOLDER.set(dataSource);
}
public static String getDataSource() {
return DATASOURCE_CONTEXT_HOLDER.get();
}
public static void clearDataSource() {
DATASOURCE_CONTEXT_HOLDER.remove();
}
}
```
在`com.example.aop`包下创建`DataSourceAspect`类,用于切换数据源:
```java
@Aspect
@Component
public class DataSourceAspect {
@Pointcut("@annotation(com.example.annotation.DataSource)")
public void dataSourcePointCut() {
}
@Before("dataSourcePointCut()")
public void before(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
DataSource dataSource = signature.getMethod().getAnnotation(DataSource.class);
if (dataSource != null) {
String value = dataSource.value();
DataSourceContextHolder.setDataSource(value);
}
}
@After("dataSourcePointCut()")
public void after(JoinPoint joinPoint) {
DataSourceContextHolder.clearDataSource();
}
}
```
6. 使用多数据源
在需要使用从数据源的方法上加上`@DataSource("sub")`注解,如:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> listUsers() {
DataSourceContextHolder.setDataSource("sub");
List<User> users = userMapper.selectList(null);
DataSourceContextHolder.clearDataSource();
return users;
}
}
```
这样就完成了Spring Boot项目中使用MyBatis Plus和Druid多数据源的配置。
阅读全文