当前位置: 首页 > article >正文

基于MyBatis插件实现动态表名解决多环境单一数据库问题

业务场景

在为某新能源汽车厂商进行我司系统私有化部署时,在预演环境和生产环境中,客户仅提供了一个 MySQL 数据库实例。为了确保数据隔离并避免不同环境之间的数据冲突,常规做法是为每个环境创建独立的表(如通过添加环境前缀或后缀)。
然而,如果每次切换环境都需要手动修改 SQL 或配置文件中的表名,不仅效率低下,而且容易出错。为此,小编利用 MyBatis 插件机制 实现了动态表名替换,从而优雅地解决了多环境共用数据库的问题。

解决方案

/*** 动态表名工具参数** @author 言安* @date 2025/3/20 14:37*/
@Data
@Component
@ConfigurationProperties(prefix = SpongeDynamicTableNameProperties.PREFIX)
public class SpongeDynamicTableNameProperties {public static final String PREFIX = "sponge.dynamic";/*** 是否开启*/private Boolean enable = Boolean.FALSE;/*** 默认表名后缀*/private String defaultTableNameSuffix;/*** 表名后缀映射(key:表名, value: 后缀)* 优先取表名后缀映射,取不到取 defaultTableNameSuffix*/private Map<String, String> tableNameSuffixMap;
}
/*** 动态表名处理器** @author 言安* @date 2025/3/20 13:41*/
@Component
public class SpongeDynamicTableNameHandler implements TableNameHandler {// 默认后缀private final static String DEFAULT_SUFFIX = "_test";@Resourceprivate SpongeDynamicTableNameProperties spongeDynamicTableNameProperties;@Overridepublic String dynamicTableName(String sql, String tableName) {String suffix = DEFAULT_SUFFIX;if (spongeDynamicTableNameProperties != null) {if (spongeDynamicTableNameProperties.getDefaultTableNameSuffix() != null) {suffix = spongeDynamicTableNameProperties.getDefaultTableNameSuffix();}if (spongeDynamicTableNameProperties.getTableNameSuffixMap() != null && spongeDynamicTableNameProperties.getTableNameSuffixMap().containsKey(tableName)) {suffix = spongeDynamicTableNameProperties.getTableNameSuffixMap().get(tableName);}}return StringUtil.isBlank(suffix) ? tableName : tableName + suffix;}
}
/*** MybatisPlus配置类** @author 言安* @date 2025/3/20 13:41*/
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfiguration {@Resourceprivate SpongeDynamicTableNameProperties spongeDynamicTableNameProperties;@Resourceprivate SpongeDynamicTableNameHandler myTableNameHandler;@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();if (spongeDynamicTableNameProperties != null && Boolean.TRUE.equals(spongeDynamicTableNameProperties.getEnable())) {// 动态表名插件DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();dynamicTableNameInnerInterceptor.setTableNameHandler(myTableNameHandler);interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);}interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
http://www.lryc.cn/news/2400704.html

相关文章:

  • 测试面试题总结一
  • Spring Boot应用多环境打包与Shell自动化部署实践
  • 【深度学习】14. DL在CV中的应用章:目标检测: R-CNN, Fast R-CNN, Faster R-CNN, MASK R-CNN
  • grpc的二进制序列化与http的文本协议对比
  • Linux 环境下 PPP 拨号的嵌入式开发实现
  • UE 材质基础第三天
  • 【Github/Gitee Webhook触发自动部署-Jenkins】
  • 软件工程专业本科毕业论文模板
  • 新松机械臂 2001端口服务的客户端例程
  • 电脑网络重置,找不到原先自家的WIFI,手机还能正常连接并上网
  • 期末复习(学习)之机器学习入门基础
  • 网络各类型(BMA,NBMA,P2P)
  • Linux 库文件的查看和管理
  • Java设计模式深度解析:策略模式的核心原理与实战应用
  • 【计算机网络】第3章:传输层—概述、多路复用与解复用、UDP
  • 6、在树莓派上安装 NTP(Network Time Protocol )服务的步骤
  • 神经符号AI的企业应用:结合符号推理与深度学习的混合智能
  • VSCode 中 C/C++ 安装、配置、使用全攻略:小白入门指南
  • 重温经典算法——希尔排序
  • CortexON:开源的多代理AI系统无缝自动化和简化日常任务
  • 海信IP810N-海思MV320芯片-安卓9-2+16G-免拆优盘卡刷固件包
  • 【Golang】使用gin框架导出excel和csv文件
  • 【unity游戏开发入门到精通——通用篇】AssetBundle(AB包)和AssetBundleBrowser的使用介绍
  • 2025年6月4日收获
  • leetcode hot100 链表(二)
  • 6. MySQL基本查询
  • JavaWeb简介
  • CMS32M65xx/67xx系列CoreMark跑分测试
  • 中国区域30m/15天植被覆盖度数据集(2010-2022)
  • LabVIEW准分子激光器智能控制系统