目录
多数据源实现
引入依赖
yml配置文件
业务代码
案例演示
多数据源实现
引入依赖
<dependency><groupId>com.baomidou</groupId><artifactId>dynamicdatasourcespringbootstarter</artifactId><version>3.5.0</version>
</dependency>
yml配置文件
spring:datasource:dynamic:#设置默认的数据源或者数据源组,默认值即为masterprimary: master#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源strict: falsedatasource:master:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driverslave_1:url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driver
配置主库和从库,指定默认主库为master数据源。
业务代码
控制层代码如下
@RestController
@RequestMapping("friend")
@Slf4j
public class FriendController {@Autowiredprivate 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);}@Autowiredprivate DataSource dataSource;@DeleteMapping("ds/del")public String remove(String name) {DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;ds.removeDataSource(name);return "删除成功";}
}
服务层代码如下
@Service
public class FriendImplService implements FriendService {@AutowiredFriendMapper friendMapper;@Override@DS("slave_1") // 从库public List<Friend> list() {return friendMapper.list();}@Override@DS("master")@DSTransactionalpublic void save(Friend friend) {friendMapper.save(friend);}@DS("master")@DSTransactionalpublic 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请求