技术杂谈SpringBoot+mybatis-plus

0. 前言

目前springBoot + mybatis-plus的框架组合在企业中使用的越来越广泛。最近遇到了一个需求,需要集成多数据源。

先来解释一下什么是多数据源,多数据源的意思就是,我需要在一个项目(工程) 中连接两个或两个以上的数据库。通常情况我们的一个项目都是连接一个数据库的,但是不排除 一些特殊情况下,需要连接多个数据库。这里一定要注意,数据源的定义是以库为区分的,只要库不同,就代表不同的数据源,不管他们是不是在同一台机器上。 而对于多数据源的引入,一般也会伴随分布式事务的问题,这里不做讨论。

多数据源的使用,在很久以前我就有过实现,不过那个时候由于各个框架还没有那么成熟,实现起来还是略有一些麻烦。 不过这次在研究的时候,发现mybatis-plus就已经封装好了相关操作,只需几步就可以轻松实现,简直不要太爽。

首先给出参考地址: 多数据源 | MyBatis-Plus
mp.baomidou.com/guide/dynam…

很简单,其实按照步骤来很容易实现。这里简单给下步骤吧。

1. 引入依赖:

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.0</version>
</dependency>
复制代码

这里用的是3.5.0,当前时段的最新版。

2. 增加配置

接下来是配置数据源:直接在配置文件中配置

server:
  port: 9999
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
复制代码

这里配置了两个,一个是master, 一个是slave_1。 如果你还需要配置其他的,接着在下面配置就行。比如再加个slave_2. 要注意,如果加了slave_2, 那么会根据前缀,把slave_1和slave_2分成一组。指定的时候,可以根据组名进行指定。官方如下;

image.png

3. 代码修改指定数据源

@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
 
}
复制代码
@Service
@DS("slave")
public class AddressServiceImpl extends ServiceImpl<AddressMapper, Address> implements AddressService {
 
}
复制代码

这个应该是比较清晰的,我的两个表,User表对应的是master数据源, address表对应的是slave数据源,这里直接用的组名。

4. 测试

创建一个Controller,通过浏览器请求进行测试。

/**
 * @className: MultiDatasourceController
 * @description:
 * @author: sh.Liu
 * @date: 2021-12-03 15:20
 */
@RestController
@RequestMapping("/")
public class MultiDatasourceController {
 
    private final UserService userService;
    private final AddressService addressService;
 
    public MultiDatasourceController(UserService userService, AddressService addressService) {
        this.userService = userService;
        this.addressService = addressService;
    }
 
    @RequestMapping("test")
    public String test() {
        User user= new User();
        user.setUserId(3L);
        user.setUserName("aaaa");
        userService.save(user);
 
        Address address = new Address();
        address.setAddressId(3L);
        address.setAddressName("hello");
        addressService.save(address);
        return "success";
    }
 
}
复制代码

简单写了一个controller, 一个保存User, 一个保存address, 就和我们正常使用mybatis-plus一样,看结果就是user保存到了master的数据源ds0库中, address保存到了slave数据源ds1中。

验证结果:

image.png

image.png

好了这就是本次的内容,怎么样,很简单吧。