SpringBoot之路:MP多数据源

在做项目过程中,难免会遇到需要同时连接多个数据的情况,这时就需要用到多数据源,配合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
<!--MybatisPlus-->
<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=斯巴鲁(杂牌))
如果文章对您有帮助,欢迎评论或打赏,感谢支持!