Spring Boot 2.X基于Mybaits-Plus实现多数据源

一般一个项目就只会用到一个数据库,但是有时候遇到比较复杂的一点的项目就会涉及到多个数据库,比如在业务量较大的时候会涉及到分库分表,如果不增加数据库代理层的话,就只有在项目中来处理。还有像我们现在在一个项目中会涉及到GBaseMySQLDB2这三种数据库,这种情况就涉及到多种数据库连接。那么我们Spring Boot中如何实现多数据库连接呢?

至于单数据库连接,可以参考我之前记录的日记Spring Boot整合Mybatis Plus和Druid,这里我们就来直接开始多数据库连接的实战。

添加依赖包

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>

Spring Boot多数据源连接PostgreSQL和MySQL配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
dynamic:
primary: mariadb
datasource:
mariadb:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
driver-class-name: org.mariadb.jdbc.Driver
druid:
initial-size: 50
max-active: 200
min-idle: 50
max-wait: 50
pgsql:
username: postgres
password: postgres
url: jdbc:postgresql://xxx.xx.xx.xxx:5432/databasename
driver-class-name: org.postgresql.Driver
druid:
initial-size: 50
max-active: 200
min-idle: 50
max-wait: 50

使用dynamic-datasource

新建实体类

我这里用到了两个实体类UserFeedback,User类就不做展示,上一篇有,这里就直接看看我们的Feddback,

1
2
3
4
5
6
7
8
9
10
@Data
@TableName("wechat_feedback")
public class Feedback {
private int id;
private String title;
private String content;

@TableField("open_id")
private String openId;
}

新建Mapper接口类

UserMapper:

1
2
3
public interface UserMapper extends BaseMapper<User>{
}

FeedbackMapper:

1
2
public interface FeedbackMapper extends BaseMapper<Feedback> {
}

在controller中调用Mapper

这里我们还是用之前编写的UserController类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@RequestMapping("/v1/user")
@RestController
@Api(tags = "User API展示")
public class UserController {

@Autowired
UserMapper userMapper;

@Autowired
FeedbackMapper feedbackMapper;

@ApiOperation(value = "mariadb", notes = "获取mariadb中的用户数据")
@GetMapping("/list")
@DS("mariadb")
public ResponseResult<?> getUserList()
{
return ResponseResult.success(userMapper.selectList(null));
}

@ApiOperation(value = "pgsql", notes = "获取pgsql中的用户反馈数据")
@GetMapping("/feedbacks")
@DS("pgsql")
public ResponseResult<?> getJobs()
{
return ResponseResult.success(feedbackMapper.selectList(null));
}
}

这里需要使用@DS注解来标识要使用的数据源,该注解可以使用在ClassMETHOD上,如果是使用在类上,则表示该类都使用这个指定的数据库连接。

1
2
3
4
5
6
7
8
9
10
11
12
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DS {

/**
* groupName or specific database name or spring SPEL name.
*
* @return the database you want to switch
*/
String value();
}

由于我这里使用到了Druid,那么还需要在启动类上加上@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class),排除掉druid-spring-boot-starter中的DruidDataSourceAutoConfigure自动配置类。

现在我们启动起来看看效果,可以再启动日志中看到

1
2
3
4
2020-02-03 12:54:42.740  INFO com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:1010) 2CNU7X5OLAUE004 --- [           main] c.a.d.p.DruidDataSource                  : {dataSource-1,mariadb} inited
2020-02-03 12:54:46.592 INFO com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:1010) 2CNU7X5OLAUE004 --- [ main] c.a.d.p.DruidDataSource : {dataSource-2,pgsql} inited
2020-02-03 12:54:46.594 INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource.addDataSource(DynamicRoutingDataSource.java:148) 2CNU7X5OLAUE004 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - load a datasource named [mariadb] success
2020-02-03 12:54:46.594 INFO com.baomidou.dynamic.datasource.DynamicRoutingDataSource.addDataSource(DynamicRoutingDataSource.java:148) 2CNU7X5OLAUE004 --- [ main] c.b.d.d.DynamicRoutingDataSource : dynamic-datasource - load a datasource named [pgsql] success

现在来访问http://localhost:8080/druid/datasource.html,可以看到两个数据源



Spring Boot 2.X基于Mybaits-Plus实现多数据源

https://blogs.52fx.biz/posts/2136619727.html

作者

eyiadmin

发布于

2020-02-01

更新于

2024-05-31

许可协议

评论