在做项目过程中,难免会遇到需要同时连接多个数据的情况,这时就需要用到多数据源,配合MP自带的组件,可以很方便的将多数据源和IService相结合。
快速上手
示例源码
官方文档
数据库
MySQL
1 2 3 4 5 6 7 8 9 10 11
| DROP TABLE IF EXISTS `phone`; CREATE TABLE `phone` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4; INSERT INTO `phone` (`id`, `name`) VALUES (1, 'Apple'); INSERT INTO `phone` (`id`, `name`) VALUES (2, '小米'); INSERT INTO `phone` (`id`, `name`) VALUES (3, '华为'); INSERT INTO `phone` (`id`, `name`) VALUES (4, '一加');
|
SQLServer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| CREATE TABLE [dbo].[car] ( [id] bigint NOT NULL, [name] varchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL ) GO ALTER TABLE [dbo].[car] SET (LOCK_ESCALATION = TABLE) GO BEGIN TRANSACTION GO INSERT INTO [dbo].[car] ([id], [name]) VALUES (N'1', N'吉利') GO INSERT INTO [dbo].[car] ([id], [name]) VALUES (N'2', N'福特') GO INSERT INTO [dbo].[car] ([id], [name]) VALUES (N'3', N'斯巴鲁(杂牌)') GO COMMIT GO
|
Maven依赖
1 2 3 4 5 6 7 8 9
| <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> </dependency>
|
⚠️根据springboot版本二选一
- 1.5.x~2.x.x使用
dynamic-datasource-spring-boot-starter
- 3及以上使用
dynamic-datasource-spring-boot3-starter
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| spring: datasource: dynamic: primary: mysql datasource: mysql: url: jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver sqlserver: url: jdbc:sqlserver://127.0.0.1:1433;databaseName=db2;encrypt=false;trustServerCertificate=true username: sa password: 123456 driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
|
配置里的mysql、sqlserver名字可以随便取,如果加下划线,则会对下划线前进行分组
Service
数据源1
1 2 3
| @Service public class PhoneServiceImpl extends ServiceImpl<PhoneMapper, Phone> implements PhoneService { }
|
因为不是严格模式,所以在不加@DS的情况下,默认访问了mysql这个数据源
数据源2
1 2 3 4
| @DS("sqlserver") @Service public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements CarService { }
|
加了@DS("sqlserver")之后,自动通过sqlserver这个数据源来访问
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Resource private PhoneService phoneService; @Resource private CarService carService; @PostConstruct public void print(){ log.info("数据源1"); for (Phone phone : phoneService.list()) { log.info(phone); } log.info("数据源2"); for (Car car : carService.list()) { log.info(car); } }
|
打印两个不同数据源的Service,控制台输出如下
1 2 3 4 5 6 7 8 9
| 数据源1 Phone(id=1, name=Apple) Phone(id=2, name=小米) Phone(id=3, name=华为) Phone(id=4, name=一加) 数据源2 Car(id=1, name=吉利) Car(id=2, name=福特) Car(id=3, name=斯巴鲁(杂牌))
|