今天我们分享多数据源的另外一直方式,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
, Model> implements IUserService {}
4.3、controller层
- @RestController
- @RequestMapping("/exportTest")
- @DS("slave")
- public class MyTestController {
-
- ..........省略
- }
4.4、方法上:
- @Select("SELECT * FROM userInfo")
- @DS("slave")
- List
selectAll();
如果遇到事务问题可参考:多数据源事务相关问题
到此,基本操作分享完毕,也是可以直接使用的,大家可以详细测试验证一下,定会收获很多!下篇我们分享根据用户完全动态获取数据源,实战性更强,敬请期待!