前言
在公司迭代一套动态数据源插件的时候,发现了Mybatis-Plus的一个小BUG,事件经过是这样的,由于业务需要,我们需要开发一套类似于数据中心的一个服务,整合了公司以前两套老平台,且平台下有对各组织进行了水平分库。组织大概有10-20个左右,需要根据所有组织或者当前组织聚合各个数据库中的数据,于是就要开发一个动态数据源的插件。
问题描述
在使用动态表的时候,com.baomidou.mybatisplus.core.toolkit.TableNameParser#accept
,该方法不支持ON DUPLICATE KEY UPDATE
语句的,该方法默认把ON DUPLICATE KEY UPDATE
后面的第一个字段名作为表名使用。
如上图中new_brand_code
显然不是一张表名,但是他判断为了表名,导致我们动态数据源工程在该列名上加上了数据库名。
问题修复
判断了mysql的特殊语句ON_DUPLICATE_KEY_UPDATE,如果判断到token为DUPLICATE到时候索引自增2直接跳过update,防止在下面循环中将update后跟的字段名作为表名。
修复代码
1 | /** |
1 | /** |
1 | private int skipDuplicateKeyUpdateIndex(int index) { |
测试用例
修复前:
修复后:
很显然cf_procedure这个字段不能作为表名。修复后改字段不再被判断为表名。