<p align="center">
<strong>一個基于springboot的快速集成多數據源的啟動器</strong>
</p>
<p align="center">
<a >
<img src="https://github.com/baomidou/dynamic-datasource-spring-boot-starter/workflows/CodeQL/badge.svg?branch=master" >
</a>
<a>
<img src="https://badgen.net/github/stars/baomidou/dynamic-datasource-spring-boot-starter" >
</a>
<a href="https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter" target="_blank">
<img src="https://img.shields.io/maven-central/v/com.baomidou/dynamic-datasource-spring-boot-starter.svg" >
</a>
<a href="https://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">
<img src="https://img.shields.io/:license-apache-brightgreen.svg" >
</a>
<a>
<img src="https://img.shields.io/badge/JDK-1.7+-green.svg" >
</a>
<a>
<img src="https://img.shields.io/badge/springBoot-1.5.x__2.x.x__3.x.x-green.svg" >
</a>
<a href="https://www.jetbrains.com">
<img src="https://img.shields.io/badge/IntelliJ%20IDEA-support-blue.svg" >
</a>
<a>
<img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" >
</a>
<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=ded31006508b57d2d732c81266dd2c26e33283f84464e2c294309d90b9674992"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="dynamic-sring-boot-starter" title="dynamic-sring-boot-starter"></a>
</p>
# 簡介
dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數據源的啟動器。
其支持 **Jdk 1.7+, SpringBoot 1.5.x 2.x.x 3.x.x**。
JPA用戶不建議使用,JPA自帶事務,無法連續切庫。
# 特性
- 支持 **數據源分組** ,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
- 支持數據庫敏感配置信息 **加密(可自定義)** ENC()。
- 支持每個數據庫獨立初始化表結構schema和數據庫database。
- 支持無數據源啟動,支持懶加載數據源(需要的時候再創建連接)。
- 支持 **自定義注解** ,需繼承DS(3.2.0+)。
- 提供并簡化對Druid,HikariCp,BeeCp,Dbcp2的快速集成。
- 提供對Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等組件的集成方案。
- 提供 **自定義數據源來源** 方案(如全從數據庫加載)。
- 提供項目啟動后 **動態增加移除數據源** 方案。
- 提供Mybatis環境下的 **純讀寫分離** 方案。
- 提供使用 **spel動態參數** 解析數據源方案。內置spel,session,header,支持自定義。
- 支持 **多層數據源嵌套切換** 。(ServiceA >>> ServiceB >>> ServiceC)。
- 提供 **基于seata的分布式事務方案** 。
- 提供 **本地多數據源事務方案。**
# 約定
1. 本框架只做 **切換數據源** 這件核心的事情,并**不限制你的具體操作**,切換了數據源可以做任何CRUD。
2. 配置文件所有以下劃線 `_` 分割的數據源 **首部** 即為組的名稱,相同組名稱的數據源會放在一個組下。
3. 切換數據源可以是組名,也可以是具體數據源名稱。組名則切換時采用負載均衡算法切換。
4. 默認的數據源名稱為 **master** ,你可以通過 `spring.datasource.dynamic.primary` 修改。
5. 方法上的注解優先于類上注解。
6. DS支持繼承抽象類上的DS,暫不支持繼承接口上的DS。
# 使用方法
1. 引入dynamic-datasource-spring-boot-starter。
**spring-boot 1.5.x 2.x.x**
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
```
**spring-boot3**
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${version}</version>
</dependency>
```
2. 配置數據源。
```yaml
spring:
datasource:
dynamic:
primary: master #設置默認的數據源或者數據源組,默認值即為master
strict: false #嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0開始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
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
#......省略
#以上會配置一個默認庫master,一個組slave下有兩個子庫slave_1,slave_2
```
```yaml
# 多主多從 純粹多庫(記得設置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** 可以注解在方法上或類上,**同時存在就近原則 方法上注解 優先于 類上注解**。
| 注解 | 結果 |
|:-------------:|:-----------------------:|
| 沒有@DS | 默認數據源 |
| @DS("dsName") | dsName可以為組名也可以為具體某個庫的名稱 |
```java
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}
```
- 付費用戶必讀
- 必讀必讀
- 專屬QQ群
- 基礎必讀(免費)
- DS詳細解析
- 連接池集成
- 連接池必讀
- 集成Druid
- 集成HikariCP
- 集成BeeCP
- 集成DBCP2
- 集成Jndi
- 第三方集成
- 集成MybatisPlus
- 集成P6spy
- 集成Quartz
- 集成ShardingJdbc
- 進階使用
- 動態添加移除數據源
- 動態解析數據源
- 數據庫加密
- 啟動初始化執行腳本
- 懶啟動數據源
- 無數據源啟動
- 手動切換數據源
- 手動注入多數據源
- 自定義
- 自定義注解
- 自定義數據源來源
- 自定義負載均衡策略
- 無注解方案
- 無注解必讀
- filter切換
- intercepror切換
- AOP切面切換
- mybatis下讀寫分離
- 事務專欄
- 事務概念
- 基礎知識
- 本地事務
- seata事務
- 事務常見問題
- 調試源碼
- 常見問題之-切換數據源失敗
- 不可用版本(免費)
- 版本記錄和選擇建議(免費)
- 知識庫
- 多租戶最佳實踐