先贴上配置多数据源用到的jar ,其他核心包自行加入
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.4.2</version>
</dependency>
贴上这一块的yml 配置
spring:
datasource:
dynamic:
primary: Read #此处配置默认库为 Read
datasource:
Read:
url: jdbc:mysql://127.0.0.1/kuRead?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
write:
url: jdbc:mysql://127.0.0.1/kuWrite?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
下面是测试写法demo扩展
注:方法注解优先于类上注解,尽量不要在类上使用多个,防止不明问题
1: @DS 注解在此方法上,此方法就会使用对应的库 ,如果使用了非默认库,不加注解的话会报错
@RequestMapping("/get")
@GetMapping
@DS("write")
public Object get(){
return userService.list(null);
}
// 这个也可以写在方法上 ,
@DS("write")
public interface UserDao extends BaseMapper<User> {
}
2:如果多个相同的库或者相同的表时,可以通用dao,servcie,impl ,model 如下:
@RequestMapping("/get")
@GetMapping
@DS("write")
public Object get(){
return userinfoService.list(null);
}
@RequestMapping("/get1")
@GetMapping
@DS("read")
public Object get1(){
return userinfoService.list(null);
}
这2个方法的指定库不同,查到的结果也不同
3: 假如共用dao等情况下,方法中有新增,查询等逻辑的时候,我们可以把具体逻辑分一下:如:
@DS("read")
public List<Userinfo> getlist() {
return UserinfoDao.getlist();
}
@DS("write")
public void insertUser(User po) {
userDao.insert(po);
}
public void get00() {
User po=new User();
po.setAge(2);
po.setName("2");
po.setPhone("2");
userinfoService.insertUser(po);
System.out.println(JSON.toJSONString( userinfoService.getlist()));
}
此方式也可以直接写在控制器中,写在service会好一点