一、添加依赖
<!-- Alibaba Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency><!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency><!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency><!--多数据源—>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.2.1</version>
</dependency>
二、排除Druid的原生配置类(否则使用的是druid原生配置,而不是动态配置的多数据源)
在工程启动类上加如下代码:
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
三、数据源配置
一般配置在application.yml:
# 默认数据源
spring.datasource.dynamic.primary = user
# 设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源
spring.datasource.dynamic.strict = true
# user库配置
spring.datasource.dynamic.datasource.user.username = zhangsan
spring.datasource.dynamic.datasource.user.password = 123456
spring.datasource.dynamic.datasource.user.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.user.url = jdbc:mysql:replication://*******:3306/user?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.user.druid.initial-size = 10
spring.datasource.dynamic.datasource.user.druid.max-active = 20
spring.datasource.dynamic.datasource.user.druid.min-idle = 10
spring.datasource.dynamic.datasource.user.druid.validation-query = select 1
spring.datasource.dynamic.datasource.user.druid.test-on-borrow = false
spring.datasource.dynamic.datasource.user.druid.test-on-return = false
spring.datasource.dynamic.datasource.user.druid.test-while-idle = true
spring.datasource.dynamic.datasource.user.druid.time-between-eviction-runs-millis = 5000
spring.datasource.dynamic.datasource.user.druid.min-evictable-idle-time-millis = 30000
spring.datasource.dynamic.datasource.user.druid.default-auto-commit = false
spring.datasource.dynamic.datasource.user.druid.default-read-only = false
spring.datasource.dynamic.datasource.user.druid.log-abandoned = true
spring.datasource.dynamic.datasource.user.druid.max-wait = 30000
spring.datasource.dynamic.datasource.user.druid.max-open-prepared-statements = 20
# order库配置
spring.datasource.dynamic.datasource.order.username = lisi
spring.datasource.dynamic.datasource.order.password = 123456
spring.datasource.dynamic.datasource.order.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.order.url = jdbc:mysql://*******:3306/order?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.order.druid.async-init = true
spring.datasource.dynamic.datasource.order.druid.initial-size = 10
spring.datasource.dynamic.datasource.order.druid.max-active = 20
spring.datasource.dynamic.datasource.order.druid.min-idle = 10
spring.datasource.dynamic.datasource.order.druid.validation-query = select 1
spring.datasource.dynamic.datasource.order.druid.test-on-borrow = false
spring.datasource.dynamic.datasource.order.druid.test-on-return = false
spring.datasource.dynamic.datasource.order.druid.test-while-idle = true
spring.datasource.dynamic.datasource.order.druid.time-between-eviction-runs-millis = 5000
spring.datasource.dynamic.datasource.order.druid.min-evictable-idle-time-millis = 30000
spring.datasource.dynamic.datasource.order.druid.default-auto-commit = false
spring.datasource.dynamic.datasource.order.druid.default-read-only = false
spring.datasource.dynamic.datasource.order.druid.log-abandoned = true
spring.datasource.dynamic.datasource.order.druid.max-wait = 30000
spring.datasource.dynamic.datasource.order.druid.max-open-prepared-statements = 20
四、多数据源的使用
@DS 注解使用介绍:
1.@DS可以用在类或者方法上,同时使用的话方法优先级更高;
2.没有@DS,则使用默认数据源;
3.@DS("ds_name") ,ds_name为配置的组名,即spring.datasource.dynamic.datasource.之后的名字,一般为可以标示数据库的名字
@Service
@DS("user")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic List<User> getByUserIds(Long userIds) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.in(CollectionUtils.isNotEmpty(userIds), "user_id", userIds);return this.list(queryWrapper);}@DS("user")@Overridepublic User getByUserId(Long userId) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id", userId);return this.getOne(queryWrapper);}
}