目录
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
spring:
datasource:
dynamic:
#设置默认的数据源或者数据源组,默认值即为master
primary: master
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
driver-class-name: com.mysql.cj.jdbc.Driver
slave_1:
url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
driver-class-name: com.mysql.cj.jdbc.Driver
配置主库和从库,指定默认主库为master数据源。
控制层代码如下
@RestController
@RequestMapping("friend")
@Slf4j
public class FriendController {
@Autowired
private FriendService friendService;
@GetMapping(value = "select")
public List<Friend> select(){
return friendService.list();
}
@GetMapping(value = "insert")
public void in(){
Friend friend = new Friend();
friend.setName("张三");
friendService.save(friend);
}
@Autowired
private DataSource dataSource;
@DeleteMapping("ds/del")
public String remove(String name) {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
ds.removeDataSource(name);
return "删除成功";
}
}
?服务层代码如下
@Service
public class FriendImplService implements FriendService {
@Autowired
FriendMapper friendMapper;
@Override
@DS("slave_1") // 从库
public List<Friend> list() {
return friendMapper.list();
}
@Override
@DS("master")
@DSTransactional
public void save(Friend friend) {
friendMapper.save(friend);
}
@DS("master")
@DSTransactional
public void saveAll(){
// 执行多数据源的操作
}
}
dao层代码如下
public interface FriendMapper {
@Select("SELECT * FROM friend")
List<Friend> list();
@Insert("INSERT INTO friend(`name`) VALUES (#{name})")
void save(Friend friend);
}
?实体代码如下
@Data
public class Friend {
private Long id;
private String name;
}
? ? ? ?使用dynamic这种方式,可以比较简单的实现多数据库,只需要在配置数据源时指定数据源名称,在使用的时候通过@DS注解指定即可,也支持多数据源下的事务,通过@DSTransactional实现。
当前数据库
执行insert请求,从数据源的数据写入了,主数据源没有数据。
执行select请求