springboot 中 mybatis-plus 多數據源切換

之前的項目中,要做多數據源,網上的一般思路都是通過AOP

在service或者mapper層做數據源的動態切換,大部分人大概切換數據源代碼如下

 @Pointcut("execution(* com.gzstrong.cloud.qspj.*.mapper..*.*(..))")
    private void db1Aspect() {
    }

    @Pointcut("execution(* com.gzstrong.cloud.qspj.interfc.mapper..*.*(..))")
    private void db2Aspect() {
    }

    @Before( "db1Aspect()" )
    public void db1(JoinPoint joinPoint) {
        log.info("切換到db1 數據源...");
        setDataSource(joinPoint,DBTypeEnum.db1);
    }

    @Before("db2Aspect()" )
    public void db2 (JoinPoint joinPoint) {
        log.info("切換到db2 數據源...");
        setDataSource(joinPoint,DBTypeEnum.db2);
    }

如果你用了mybatis-plus的,切換數據源就更簡單了,下面是官方介紹

特性

  1. 數據源分組,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
  2. 內置敏感參數加密和啓動初始化表結構schema數據庫database。
  3. 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
  4. 簡化Druid和HikariCp配置,提供全局參數配置。
  5. 提供自定義數據源來源接口(默認使用yml或properties配置)。
  6. 提供項目啓動後增減數據源方案。
  7. 提供Mybatis環境下的 純讀寫分離 方案。
  8. 使用spel動態參數解析數據源,如從session,header或參數中獲取數據源。(多租戶架構神器)
  9. 提供多層數據源嵌套切換。(ServiceA >>> ServiceB >>> ServiceC,每個Service都是不同的數據源)
  10. 提供 不使用註解 而 使用 正則 或 spel 來切換數據源方案(實驗性功能)。

約定

  1. 本框架只做 切換數據源 這件核心的事情,並不限制你的具體操作,切換了數據源可以做任何CRUD。
  2. 配置文件所有以下劃線 _ 分割的數據源 首部 即爲組的名稱,相同組名稱的數據源會放在一個組下。
  3. 切換數據源可以是組名,也可以是具體數據源名稱。組名則切換時採用負載均衡算法切換。
  4. 默認的數據源名稱爲 master ,你可以通過 spring.datasource.dynamic.primary 修改。
  5. 方法上的註解優先於類上註解。

下面是Mybatis-plus的多數據源的具體代碼

1,加入相關引入jar

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.7</version>
        </dependency>

2,配置多個數據源

spring:
  datasource:
    dynamic:
      primary: master #設置默認的數據源或者數據源組,默認值即爲master
      datasource:
        master:
          username: root
          password: admin
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/ds_0?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        slave_1:
          username: root
          password: admin
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/ds_1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

就這2步就可以了,簡不簡單,當你需要操作master庫時,

系統默認指向master庫,當你需要操作slave_1庫時,

類或者方法前加入@DS("slave_1")

 

簡單吧,如果對你有用的話,方便點個贊,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章