MyBatis-Plus自定义动态数据源

动态数据源默认实现是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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值