0. 前言
目前springBoot + mybatis-plus的框架组合在企业中使用的越来越广泛。最近遇到了一个需求,需要集成多数据源。
先来解释一下什么是多数据源,多数据源的意思就是,我需要在一个项目(工程) 中连接两个或两个以上的数据库。通常情况我们的一个项目都是连接一个数据库的,但是不排除 一些特殊情况下,需要连接多个数据库。这里一定要注意,数据源的定义是以库为区分的,只要库不同,就代表不同的数据源,不管他们是不是在同一台机器上。 而对于多数据源的引入,一般也会伴随分布式事务的问题,这里不做讨论。
多数据源的使用,在很久以前我就有过实现,不过那个时候由于各个框架还没有那么成熟,实现起来还是略有一些麻烦。 不过这次在研究的时候,发现mybatis-plus就已经封装好了相关操作,只需几步就可以轻松实现,简直不要太爽。
首先给出参考地址: 多数据源 | MyBatis-Plusmp.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 port9999spring 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分成一组。指定的时候,可以根据组名进行指定。官方如下;
3. 代码修改指定数据源
"master") (publicclassUserServiceImplextendsServiceImpl<UserMapper, User>implementsUserService { } 复制代码
"slave") (publicclassAddressServiceImplextendsServiceImpl<AddressMapper, Address>implementsAddressService { } 复制代码
这个应该是比较清晰的,我的两个表,User表对应的是master数据源, address表对应的是slave数据源,这里直接用的组名。
4. 测试
创建一个Controller,通过浏览器请求进行测试。
/*** @className: MultiDatasourceController* @description:* @author: sh.Liu* @date: 2021-12-03 15:20*/"/") (publicclassMultiDatasourceController { privatefinalUserServiceuserService; privatefinalAddressServiceaddressService; publicMultiDatasourceController(UserServiceuserService, AddressServiceaddressService) { this.userService=userService; this.addressService=addressService; } "test") (publicStringtest() { Useruser=newUser(); user.setUserId(3L); user.setUserName("aaaa"); userService.save(user); Addressaddress=newAddress(); address.setAddressId(3L); address.setAddressName("hello"); addressService.save(address); return"success"; } } 复制代码
简单写了一个controller, 一个保存User, 一个保存address, 就和我们正常使用mybatis-plus一样,看结果就是user保存到了master的数据源ds0库中, address保存到了slave数据源ds1中。
验证结果:
好了这就是本次的内容,怎么样,很简单吧。