dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。这是一个第三方 mybatis 扩展库,与 mybatis-plus 本身无关,属于组织参与者小锅盖个人发起的项目,任何行为与 baomidou 组织其它成员无关。
dynamic-datasource特性
实例: 项目结构图如下:

实现步骤:
1.在pom.xml中添加dynamic-datasource依赖
<!--mybatis-plus multi-datasource plugin-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2.配置数据源
#yml格式配置文档范例
server:
#端口配置
port: 8080
#上下文
servlet:
context-path: /multidsdemo
#数据源配置
spring:
#开启热部署
devtools:
restart:
enabled: true
#让静态页面也能热部署
additional-paths: resources/**,static/**,templates/**
#配置数据源
datasource:
#多数据源配置
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
#Springboot2.0 的hikari配置
hikari:
minimum-idle: 5
#空闲连接存活最大时间,默认600000(10分钟)
idle-timeout: 180000
#连接池最大连接数,默认是10
maximum-pool-size: 10
#此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
#连接池名称
pool-name: MyHikariCP
#此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 1800000
#数据库连接超时时间,默认30秒,即30000
connection-timeout: 30000
connection-test-query: SELECT 1
jpa:
show-sql: true
properties:
hibernate:
#dialect: org.hibernate.dialect.MySQL5Dialect ,注意这个是不支持事务的方言。
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
format_sql: true
#配置懒加载策略
enable_lazy_load_no_trans: true
hbm2ddl:
auto: update
3.使用 @DS 切换数据源
| 注解 | 结果 |
|---|---|
| 没有@DS | 默认数据源 |
| @DS("dsName") | dsName可以为组名也可以为具体某个库的名称 |
UsersService.java
import com.baomidou.mybatisplus.extension.service.IService;
import com.simoniu.mp.multidsdemo.entity.Users;
import java.util.List;
public interface UsersService extends IService<Users> {
//从Master数据源查询所有用户
List<Users> queryAllUsersWithMaster();
//从Salve数据源查询所有用户
List<Users> queryAllUsersWithSalve();
}
UsersServiceImpl.java
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.simoniu.mp.multidsdemo.entity.Users;
import com.simoniu.mp.multidsdemo.mapper.UsersMapper;
import com.simoniu.mp.multidsdemo.service.UsersService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper,Users> implements UsersService {
//没有@DS 默认数据源master
@Override
public List<Users> queryAllUsersWithMaster() {
return super.list(null);
}
@Override
//使用salve数据源
@DS("slave")
public List<Users> queryAllUsersWithSalve() {
return super.list(null);
}
}
单元测试
import com.simoniu.mp.multidsdemo.entity.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UsersServiceTest {
@Resource
private UsersService usersService;
@Test
public void testQueryAllUsersWithMaster(){
List<Users> usersList = usersService.queryAllUsersWithMaster();
usersList.forEach(System.out::println);
}
@Test
public void testQueryAllUsersWithSalve(){
List<Users> usersList = usersService.queryAllUsersWithSalve();
usersList.forEach(System.out::println);
}
}
测试结果:
//master数据源数据
Users(uid=1, username=管理员, password=123456)
Users(uid=2, username=张三, password=654321)
//salve数据源数据
Users(uid=1, username=admin, password=123456)
Users(uid=2, username=zhangsan, password=654321)