基于springboot配置多数据源

一. 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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值