一. pom文件
<?xml version="1.0" encoding="UTF-8"?><parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
二. yml
server:
port: 8888
spring:
application:
name: mydatasouce
datasource:
type: com.alibaba.druid.pool.DruidDataSource
datasource1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
datasource2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
三.创建mybatis 配置文件
@Configuration
public class MyBatisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.datasource1")
public DataSource dataSource1(){
return new DruidDataSource();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
public DataSource dataSource2(){
return new DruidDataSource();
}
@Bean
public Interceptor interceptor(){
return new DynamicDataSourcePlugin();
}
}
四.使用mybatis插件方式设置数据源
@Intercepts(
{@Signature(type = Executor.class, method = "update", args = {MappedStatement.class,Object.class}),
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class,Object.class, RowBounds.class
, ResultHandler.class
})})
public class DynamicDataSourcePlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
//拿到当前方法(update,query)所有参数
Object[] objects = invocation.getArgs();
//封装MappedStated 所有的crud
MappedStatement ms = (MappedStatement) objects[0];
//读方法
if(ms.getSqlCommandType().equals(SqlCommandType.SELECT)){
DynamicDataSource.name.set("R");
}else{
DynamicDataSource.name.set("W");
}
//修改当前线程要选择的数据源的key
return invocation.proceed();
}
}
五.设置多数据源
@Component
@Primary //将该bean设置为主要注入的bean
public class DynamicDataSource extends AbstractRoutingDataSource {
//当前使用数据源标识
public static ThreadLocal<String> name = new ThreadLocal<>();
@Autowired
DataSource dataSource1;
@Autowired
DataSource dataSource2;
//返回当前数据源标识
@Override
protected Object determineCurrentLookupKey() {
return name.get();
}
@Override
public void afterPropertiesSet() {
//初始化所有数据源
HashMap<Object, Object> map = new HashMap<>();
map.put("R",dataSource1);
map.put("W",dataSource2);
super.setTargetDataSources(map);
//为defaultTargetSource设置默认数据源
super.setDefaultTargetDataSource(dataSource1);
super.afterPropertiesSet();
}
}
六.编写接口
@RestController
public class DemoController {
@Autowired
DemoMapper DemoMapper;
@GetMapping("/list")
public List<Users> list(){
return DemoMapper.list();
}
@PostMapping("/insert")
public void insert(Users users){
DemoMapper.insert(users);
}
}
利用AOP设置多数据源
七.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
八.在启动类添加 @EnableAspectJAutoProxy//启动AOP
九 .编写注解
@Target({ElementType.METHOD,ElementType.TYPE})
//保留方式
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "W";
}
十.配置aop
@Component
@Aspect
public class DynamicDataSourceAspect {
//前置通知
@Before("within(com.cp.controller.*) && @annotation(myAnnotation)")
public void before(JoinPoint point, MyAnnotation myAnnotation){
String value = myAnnotation.value();
DynamicDataSource.name.set(value);
}
}