文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
提出问题
在平时开发中,经常会遇到在一个项目里需要使用多个数据源的情况,比如有一部分数据在数据源A,另一部分数据在数据源B,业务需要把这两部分的数据做合并然后从接口返回。
又或者操作完数据源A后,需要切换数据源,操作数据源B。这样的需求,怎么实现?
解决问题
其实在mybatis-plus就有相关的实现,是一个基于SpringBoot快速集成多数据源的启动器。
首先要搭建一个springBoot+Mybatis+Mybatis-Plus的项目,搭建项目就不演示了,比较简单。这里讲怎么使用多数据源,首先引入dynamic-datasource-spring-boot-starter
。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version><!--版本号-->
</dependency>
第二步,修改application配置文件,配置数据源。
# 默认数据源
spring.datasource.dynamic.primary=master
# 数据源A
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.0.101:3306/user?createDatabaseIfNotExist=true
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=
# 数据源B
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://192.168.0.102:3306/user?createDatabaseIfNotExist=true
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=
第三步,使用@DS注解切换数据源。一般我喜欢放在Mapper接口上面。注解的值则是数据源的名称。
现在有两个数据源,如图所示:
slave数据源的user表对应的Mapper接口,如下:
@Mapper
@DS("slave")
public interface UserMapper extends BaseMapper<User> {
}
master数据源的commodity表对应的Mapper接口,如下:
@Mapper
@DS("master")
public interface CommodityMapper extends BaseMapper<Commodity> {
}
接着我们写一个Service进行测试:
@Service
public class DynamicServiceImpl implements DynamicService {
@Resource
private UserMapper userMapper;
@Resource
private CommodityMapper commodityMapper;
@Override
public ResultObject getUserListAndCommodityList() {
//查询slave数据源
List<User> userList = userMapper.selectList(null);
//查询master数据源
List<Commodity> commodityList = commodityMapper.selectList(null);
//把两个数据源查询的整合到一起返回
ResultObject resultObject = new <