pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot</artifactId>
<version>1.3.1</version>
</parent>
<artifactId>mybatis-spring-boot-starter</artifactId>
<name>mybatis-spring-boot-starter</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
</dependencies>
</project>
application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
user:
url: jdbc:mysql://127.0.0.1:3306/cloud_user?useUnicode=true&characterEncoding=utf8
username: root
password: root
order:
url: jdbc:mysql://127.0.0.1:3306/cloud_order?useUnicode=true&characterEncoding=utf8
username: root
password: root
自定义注解
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface DS { /** * 数据源名称 */ String value(); }
@Aspect
@Component
public class DynamicDataSourceAspect {
@Pointcut("@annotation(com.jacob.datas.annotation.DS)")
public void dataSourcePointCut() {
}
@Around("dataSourcePointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
String dsKey = getDSAnnotation(joinPoint).value();
DynamicDataSourceContextHolder.setContextKey(dsKey);
try {
return joinPoint.proceed();
} finally {
DynamicDataSourceContextHolder.removeContextKey();
}
}
/**
* 根据类或方法获取数据源注解
*/
private DS getDSAnnotation(ProceedingJoinPoint joinPoint) {
Class<?> targetClass = joinPoint.getTarget().getClass();
DS dsAnnotation = targetClass.getAnnotation(DS.class);
// 先判断类的注解,再判断方法注解
if (Objects.nonNull(dsAnnotation)) {
return dsAnnotation;
} else {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
return methodSignature.getMethod().getAnnotation(DS.class);
}
}
}
public interface DataSourceConstants {
/**
* 数据库-user
*/
String USER = "USER";
/**
* 数据库-单点系统
*/
String ORDER = "ORDER";
}
配置数据源
@Configuration
@MapperScan(basePackages = {"com.jacob.datas.mapper"})
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class DynamicDataSourceConfig {
@Bean
@Primary
public DataSource dynamicDataSource() {
Map<Object, Object> dataSourceMap = new HashMap<>(2);
dataSourceMap.put(DataSourceConstants.USER, userDataSource());
dataSourceMap.put(DataSourceConstants.ORDER, orderDataSource());
//设置动态数据源
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(dataSourceMap);
//单点登录系统,设置默认数据源为点点登陆数据库
dynamicDataSource.setDefaultTargetDataSource(userDataSource());
return dynamicDataSource;
}
@Value("${spring.datasource.user.url}")
private String dbUrl1;
@Value("${spring.datasource.user.username}")
private String username1;
@Value("${spring.datasource.user.password}")
private String password1;
@Value("${spring.datasource.order.url}")
private String dbUrl2;
@Value("${spring.datasource.order.username}")
private String username2;
@Value("${spring.datasource.order.password}")
private String password2;
@Value("${spring.datasource.driverClassName}")
/**
* 数据源-user
*/
@Bean("USER")
public DataSource userDataSource() {
DruidDataSource ds =new DruidDataSource();
ds.setUrl(dbUrl1);
ds.setUsername(username1);
ds.setPassword(password1);
return ds;
}
/**
* 数据源-order
*/
@Bean("ORDER")
public DataSource orderDataSource() {
DruidDataSource ds =new DruidDataSource();
ds.setUrl(dbUrl2);
ds.setUsername(username2);
ds.setPassword(password2);
return ds;
}
}
public class DynamicDataSourceContextHolder {
/**
* 动态数据源名称上下文
*/
private static final ThreadLocal<String> DATASOURCE_CONTEXT_KEY_HOLDER = new ThreadLocal<>();
/**
* 设置/切换数据源
*/
public static void setContextKey(String key) {
DATASOURCE_CONTEXT_KEY_HOLDER.set(key);
}
/**
* 获取数据源名称
*/
public static String getContextKey() {
String key = DATASOURCE_CONTEXT_KEY_HOLDER.get();
return key == null ? DataSourceConstants.USER : key;
}
/**
* 删除当前数据源名称
*/
public static void removeContextKey() {
DATASOURCE_CONTEXT_KEY_HOLDER.remove();
}
}
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getContextKey();
}
}
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class DynamicDataSourceApplication {
public static void main(String[] args) {
SpringApplication.run(DynamicDataSourceApplication.class,args);
}
}
@DS(value= DataSourceConstants.USER)
public User getUser(Long id){
return userMapper.findById(id);
}
@DS(value= DataSourceConstants.USER)就可以指定数据源