[研究]SpringBoot-MybatisPlus-Dynamic(多資料來源)
阿新 • • 發佈:2020-12-13
SpringBoot-MybatisPlus-Dynamic(多資料來源)
前言
基於工作上班累死了。。。開啟自己電腦 不知道幹些啥 就康康 PL 網站康康 更新了啥
咦~~~還挺多 看到了多資料來源整合 挺簡單的 來玩玩看看
簡介
dynamic-datasource-spring-boot-starter 是一個基於springboot的快速整合多資料來源的啟動器。其支援 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x。
特性
- 支援 資料來源分組 ,適用於多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 支援資料庫敏感配置資訊 加密 ENC()。
- 支援每個資料庫獨立初始化表結構schema和資料庫database。
- 支援 自定義註解 ,需繼承DS(3.2.0+)。
- 提供對Druid,Mybatis-Plus,P6sy,Jndi的快速整合。
- 簡化Druid和HikariCp配置,提供 全域性引數配置 。配置一次,全域性通用。
- 提供 自定義資料來源來源 方案。
- 提供專案啟動後 動態增加移除資料來源 方案。
- 提供Mybatis環境下的 純讀寫分離 方案。
- 提供使用 spel動態引數 解析資料來源方案。內建spel,session,header,支援自定義。
- 支援 多層資料來源巢狀切換 。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供對shiro,sharding-jdbc,quartz等第三方庫整合的方案,注意事項和示例。
- 提供 基於seata的分散式事務方案。 附:不支援原生spring事務。
#約定
- 本框架只做 切換資料來源 這件核心的事情,並不限制你的具體操作,切換了資料來源可以做任何CRUD。
- 配置檔案所有以下劃線
_
分割的資料來源 首部 即為組的名稱,相同組名稱的資料來源會放在一個組下。 - 切換資料來源可以是組名,也可以是具體資料來源名稱。組名則切換時採用負載均衡演算法切換。
- 預設的資料來源名稱為 master ,你可以通過
spring.datasource.dynamic.primary
修改。 - 方法上的註解優先於類上註解。
- 強烈建議只在service的類和方法上添加註解,不建議在mapper上添加註解。
使用方法
- 引入依賴
<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>
-
配置資料來源。
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
-
其它配置格式
# 多主多從 純粹多庫(記得設定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:
-
使用 @DS 切換資料來源。
@DS 可以註解在方法上和類上,同時存在方法註解優先於類上註解。
強烈建議只註解在service實現上。
多資料來源的使用
註解 結果 沒有@DS 預設資料來源 @DS("dsName") dsName可以為組名也可以為具體某個庫的名稱
配置多資料來源
主資料來源(預設)
省略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);
}
}