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

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

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

首先给出参考地址: 多数据源 | MyBatis-Plus

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

首先是引入依赖:

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

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

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

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分成一组。指定的时候,可以根据组名进行指定。官方如下; 

接下来,在不同的service上配置对应的数据源。

@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数据源,这里直接用的组名。

最后我们就可以进行测试了。

/**
 * @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中。

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

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2fth0bqny7r4o

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐