[研究]SpringBoot-MybatisPlus-Dynamic(多數據源)


SpringBoot-MybatisPlus-Dynamic(多數據源)

前言

​ 基於工作上班累死了。。。打開自己電腦 不知道干些啥 就康康 PL 網站康康 更新了啥

​ 咦~~~還挺多 看到了多數據源集成 挺簡單的 來玩玩看看

簡介

dynamic-datasource-spring-boot-starter 是一個基於springboot的快速集成多數據源的啟動器。其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x

特性

  1. 支持 數據源分組 ,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
  2. 支持數據庫敏感配置信息 加密 ENC()。
  3. 支持每個數據庫獨立初始化表結構schema和數據庫database。
  4. 支持 自定義注解 ,需繼承DS(3.2.0+)。
  5. 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速集成。
  6. 簡化Druid和HikariCp配置,提供 全局參數配置 。配置一次,全局通用。
  7. 提供 自定義數據源來源 方案。
  8. 提供項目啟動后 動態增加移除數據源 方案。
  9. 提供Mybatis環境下的 純讀寫分離 方案。
  10. 提供使用 spel動態參數 解析數據源方案。內置spel,session,header,支持自定義。
  11. 支持 多層數據源嵌套切換 。(ServiceA >>> ServiceB >>> ServiceC)。
  12. 提供對shiro,sharding-jdbc,quartz等第三方庫集成的方案,注意事項和示例。
  13. 提供 基於seata的分布式事務方案。 附:不支持原生spring事務。

#約定

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

使用方法

  1. 引入依賴
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
		// 多數據源依賴
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.5</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.4.1</version>
        </dependency>
    </dependencies>
  1. 配置數據源。

    spring:
      datasource:
        dynamic:
          primary: master #設置默認的數據源或者數據源組,默認值即為master
          strict: false #設置嚴格模式,默認false不啟動. 啟動后在未匹配到指定數據源時候會拋出異常,不啟動則使用默認數據源.
          datasource:
            master:
              url: jdbc:mysql://xxxxxxxx:3310/picture
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver # 3.2.0開始支持SPI可省略此配置
            slave_1:
              url: jdbc:mysql://xxxxxxxx:3310/picture
              username: root
              password: 123456
              driver-class-name: com.mysql.jdbc.Driver
            slave_2:
                url: ENC(xxxxx) # 內置加密,使用請查看詳細文檔
                username: ENC(xxxxx)
                password: ENC(xxxxx)
                driver-class-name: com.mysql.jdbc.Driver
                schema: db/schema.sql # 配置則生效,自動初始化表結構
                data: db/data.sql # 配置則生效,自動初始化數據
                continue-on-error: true # 默認true,初始化失敗是否繼續
                separator: ";" # sql默認分號分隔符
    
            #......省略
            #以上會配置一個默認庫master,一個組slave下有兩個子庫slave_1,slave_2
    
    
    #mybatisplus的配置
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      mapper-locations: classpath:mapper/*Mapper.xml
      global-config:
        db-config:
          id-type: auto
    
  2. 其它配置格式

    # 多主多從                      純粹多庫(記得設置primary)                   混合配置
    spring:                               spring:                               spring:
      datasource:                           datasource:                           datasource:
        dynamic:                              dynamic:                              dynamic:
          datasource:                           datasource:                           datasource:
            master_1:                             mysql:                                master:
            master_2:                             oracle:                               slave_1:
            slave_1:                              sqlserver:                            slave_2:
            slave_2:                              postgresql:                           oracle_1:
            slave_3:                              h2:                                   oracle_2:
    
  3. 使用 @DS 切換數據源。

    @DS 可以注解在方法上和類上,同時存在方法注解優先於類上注解

    強烈建議只注解在service實現上。

    多數據源的使用

    注解 結果
    沒有@DS 默認數據源
    @DS("dsName") dsName可以為組名也可以為具體某個庫的名稱

配置多數據源

image-20201213220017378

主數據源(默認)

省略CRUD代碼自己生成一份即可
/**
* ClassName: Loginfo
* Description: 楊不易網站 :www.yangbuyi.top
* date: 2020/12/13
* @author TeouBle
* @author yangbuyi
* @since JDK 1.8
**/

@Service(value = "LoginServiceImpl")
public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login> implements LoginService{
	/**
	 * 主數據庫
	 * */
	@Autowired
	private LoginMapper loginMapper;

	@Override
	public List<Login> loginList() {
		return loginMapper.selectList(null);
	}

}

從數據源

package top.yangbuyi.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.yangbuyi.domain.Login;
import top.yangbuyi.mapper.LoginMapper;
import top.yangbuyi.service.LoginService;

import java.util.List;

/**
 * ClassName: Loginfo
 * Description: 楊不易網站 :www.yangbuyi.top
 * date: 2020/12/13
 *
 * @author TeouBle
 * @author yangbuyi
 * @since JDK 1.8
 **/

@Service(value = "LoginServiceSlaveImpl")
@DS("slave_1") // 從數據源名稱
public class LoginServiceSlaveImpl extends ServiceImpl<LoginMapper, Login> implements LoginService {
	@Autowired
	private LoginMapper loginMapper;

	/**
	 * 從數據庫
	 * */
	@Override
	public List<Login> loginList() {
		return loginMapper.selectList(null);
	}
}

最終測試訪問同數據庫數據

img

楊不易呀個人博客

數據源文檔官方網站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM