动态数据源默认实现是YmlDynamicDataSourceProvider,其从yaml或properties中读取信息并解析出所有数据源信息。
自定义示例
/*
Navicat Premium Data Transfer
Source Server : 192.168.7.18(AI)
Source Server Type : MySQL
Source Server Version : 50736
Source Host : 192.168.7.18:3306
Source Schema : intelligent_structured
Target Server Type : MySQL
Target Server Version : 50736
File Encoding : 65001
Date: 10/06/2025 16:20:27
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for data_source_config
-- ----------------------------
DROP TABLE IF EXISTS `data_source_config`;
CREATE TABLE `data_source_config` (
`db_sharding` int(11) NOT NULL COMMENT '模块标识',
`driver_class` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'JDBC Driver',
`url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'JDBC URL',
`username` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`password` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码/可ENC()加密',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '启用开关',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`create_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`update_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
`del_flag` int(11) NULL DEFAULT 0 COMMENT '删除标记',
`version` int(11) NULL DEFAULT 1 COMMENT '版本',
PRIMARY KEY (`module_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '动态数据源配置表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
@Component
@Data
@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
@RequiredArgsConstructor
public class JdbcDynamicProvider {
@Autowired
DefaultDataSourceCreator defaultDataSourceCreator;
String url;
String username;
String password;
/**
* jdbc数据源提供者
*
* @return
*/
@Bean
public DynamicDataSourceProvider jdbcDynamicDataSourceProvider() {
return new AbstractJdbcDataSourceProvider(defaultDataSourceCreator, url, username, password) {
@Override
protected Map<String, DataSourceProperty> executeStmt(Statement statement) throws SQLException {
ResultSet rs = statement.executeQuery("select * from data_source_config");
Map<String, DataSourceProperty> map = new HashMap<>();
while (rs.next()) {
String name = rs.getString("db_sharding");
String username = rs.getString("username");
String password = rs.getString("password");
String url = rs.getString("url");
String driver = rs.getString("driver_class");
DataSourceProperty property = new DataSourceProperty();
property.setUsername(username);
property.setPassword(password);
property.setUrl(url);
property.setDriverClassName(driver);
map.put(name, property);
}
return map;
}
};
}
}
使用mybatis-plus @DS(“#参数”) // 支持 Spring EL 表达式,实现动态数据源的切换,调用的时候传递dbSharding为配置表中的值即可。
/**
* 获取表格数据
*/
@DS("#dbSharding")
@Service
public class TProjecttreeServiceImpl extends ServiceImpl<TProjecttreeMapper, TProjecttree> implements TProjecttreeService {
@Override
public List<TProjecttree> listBatchByLastId(String dbSharding, String sharding, String lastId, Integer batchSize) {
return baseMapper.listBatchByLastId(sharding, lastId, batchSize);
}
}