<p align="center">
<img src="https://images.gitee.com/uploads/images/2019/0626/231046_f44892b9_709883.png" border="0" />

</p>

<p align="center">
	<strong>一个基于springboot的快速集成多数据源的启动器</strong>
</p>

<p align="center">
   <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-8+-green.svg" >
    </a>
    <a>
        <img src="https://img.shields.io/badge/springBoot-1.5.x__2.x.x__3.x.x__4.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 4.x.x**。

## 文档 | Documentation

最新文档 https://doc.xiuceyun.cn

旧看云文档，后面不维护更新了 https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611

## 贡献 | Contributing

我们欢迎社区的贡献，请查看 [CONTRIBUTING.md](./CONTRIBUTING.md) 。

# 特性

- 支持 **数据源分组** ，适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
- 支持数据库敏感配置信息 **加密(可自定义)**  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。

# 使用方法

## 版本选择

根据您的 Spring Boot 和 JDK 版本选择对应的 starter 模块：

| Spring Boot 版本 | JDK 版本要求 | 项目开始支持版本 | Starter 模块                                |
|:--------------:|:--------:|:--------:|:------------------------------------------|
| 1.5.x ~ 2.x.x  |  JDK 8+  |  1.0.0+  | `dynamic-datasource-spring-boot-starter`  |
|     3.x.x      | JDK 17+  |  4.0.0+  | `dynamic-datasource-spring-boot3-starter` |
|     4.x.x      | JDK 17+  |  4.5.0+  | `dynamic-datasource-spring-boot4-starter` |

> **说明：**
> - Spring Boot 1.5.x ~ 2.x.x 使用 `dynamic-datasource-spring-boot-starter`，支持 JDK 8 及以上版本
> - Spring Boot 3.x.x 使用 `dynamic-datasource-spring-boot3-starter`，**要求 JDK 17 及以上**
> - Spring Boot 4.x.x 使用 `dynamic-datasource-spring-boot4-starter`，**要求 JDK 17 及以上**

2. 配置数据源。

```yaml
spring:
  datasource:
    dynamic:
      enabled: true #启用动态数据源，默认true
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      grace-destroy: false #是否优雅关闭数据源，默认为false，设置为true时，关闭数据源时如果数据源中还存在活跃连接，至多等待10s后强制关闭
      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
spring:
  datasource:
    dynamic:
      datasource:
        master_1:
        master_2:
        slave_1:
        slave_2:
        slave_3:
```

**纯粹多库：**
```yaml
spring:
  datasource:
    dynamic:
      datasource:
        mysql:
        oracle:
        sqlserver:
        postgresql:
        h2:
```

**混合配置：**
```yaml
spring:
  datasource:
    dynamic:
      datasource:
        master:
        slave_1:
        slave_2:
        oracle_1:
        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");
    }
}
```
