今天我们分享多数据源的另外一直方式,SpringBoot整合Mybatisplus配置多数据源,此种方式配置相对简单,都是封装好的API,上手容易;底层原理也是继承 AbstractRoutingDataSource等相关类,只是封装更好一些,开箱即用,少走弯路!此篇我们分享业务比较简单的方式配置数据源,既多个固定的数据源,通过注解选择使用哪个数据源!废话少说,切入正题。
1、相关核心包引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
2、相关数据源yml 配置:
server:
port: 8000
spring:
datasource:
dynamic:
primary: master# 配置默认数据库,及没有注解指定时走的数据库
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master: # 数据源1配置
url: jdbc:mysql://localhost:3306/user_db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave: # 数据源2配置
url: jdbc:mysql://localhost:3306/user_db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
durid:
initial-size: 1
max-active: 20
min-idle: 1
max-wait: 60000
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid自动加载的配置,也可以在启动类里添加
3、启动类配置:
//去掉自动加载数据源的配置类
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
释疑:服务启动时DruidDataSourceAutoConfigure
会注入一个DataSourceWrapper
,其会在原生的spring.datasource
下找 url, username, password
等信息。动态数据源 URL
等配置是在 dynamic
下,因此需要排除,否则会报错。
排除方式有两种,一种是上述配置文件排除
,还有一种可以在项目启动类排除,上面已经演示!
4、样例注解配置演示:
使用@DS指定数据源,给使用非默认数据源添加注解@DS,比如@DS("slave"),如果不加或者加@DS("master"),就会走默认数据源;@DS可以注解在 方法 上和 类 上,同时存在方法注解优先于类上注解;注解在 controller层、service 实现或 mapper 接口方法上,不要同时在 service 和 mapper 注解;官方强烈建议加在service上,主要要保证事务!
4.1、mapper层
@DS("slave")
public interface UserInfoMapper extends BaseMapper<User> {
}
4.2、service层
@Service
@DS("slave")
public class UserServiceImpl extends ServiceImpl<ModelMapper, Model> implements IUserService {}
4.3、controller层
@RestController
@RequestMapping("/exportTest")
@DS("slave")
public class MyTestController {
..........省略
}
4.4、方法上:
@Select("SELECT * FROM userInfo")
@DS("slave")
List<UserInfo> selectAll();
如果遇到事务问题可参考:多数据源事务相关问题
到此,基本操作分享完毕,也是可以直接使用的,大家可以详细测试验证一下,定会收获很多!下篇我们分享根据用户完全动态获取数据源,实战性更强,敬请期待!