简介
经常遇到这种情况,某个应用Mybatis本身连接的1个Mysql数据源,这时候有需求要操作另外一个Mysql数据库的表,那么如何更方便的实现呢?我在SpringBoot项目中实战了一下。
环境
- Idea2019
- Jdk1.8
- Maven3.6.3
集成配置
SpringBoot项目和MyBatis的集成就不多说了,可以《SpringBoot实战记录1:集成Mybatis》,如下是动态数据源的配置
pom依赖配置
1 | <dependency> |
application.yml配置
配置一个默认主数据源master和一个次数据源slave_1,更多个依次类推1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: true #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: xxx
password: xxx
url: jdbc:mysql://xxx1:3306/xxxdb1?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
slave_1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: xxx
password: xxx
url: jdbc:mysql://xxx2:3306/xxxdb2?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
使用方式
建议在Service类和方法上使用@DS注解,当类和方法中同时存在@DS注解时,以方法上的为准,具体说明可参考:《一个基于springboot的快速集成多数据源的启动器》,
如下为示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 会走master
"master") (
public R m1(Map<String,String> param) {
return R.success(selectTemp(param.get("name")), null);
}
// 会走slave_1
"slave_1") (
public R m2(Map<String, String> param) {
return R.success(selectTemp(param.get("name")), null);
}
// 默认会走master
public R m3(Map<String, String> param) {
return R.success(selectTemp(param.get("name")), null);
}
private Object selectTemp(String name) {
PasRecordInfo info = this.getOne(new QueryWrapper<User>().eq("name", name));
return info;
}
效果
测试发现:
- 调用上述m1、m2、m3三个方法分别走到了上述备注中的数据源。
- 当整个Service类上加上了@DS(“slave_1”),那么没有注解的方法会走slave_1数据源。
结束语
只为记录点滴成长,加油!
本文链接: https://www.xiajunyi.com/pages/p77.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!