东莞百度网站优化,佛山市网站建设分站企业,做利基网站用备案,wordpress销售key,value,isDef关键字的隐藏bug
前言#xff1a;
有个 老师傅创建表用关键字#xff0c;返回的response用特殊字符导致的问题
1 #xff0c;表创建用到了关键字
表如下#xff1a;
CREATE TABLE system_xxx_config(id BIGINT NOT NULL COMMENT 主键 PRIMARY …key,value,isDef关键字的隐藏bug前言有个老师傅创建表用关键字返回的response用特殊字符导致的问题1 表创建用到了关键字表如下CREATE TABLE system_xxx_config(id BIGINT NOTNULLCOMMENT主键PRIMARY KEY,keyvarchar(255)NOTNULLCOMMENT配置文件key,valuevarchar(512)NOTNULLCOMMENT配置文件value,...)COMMENTxxx配置表COLLATEutf8mb4_unicode_ci;正常我们写接口使用BaseMapper集成 MyBatis实现简单的crud代码如下Override public RGlobalConfigVoqueryxxxConfigVoByKey(String key){GlobalConfigVo configVonewGlobalConfigVo();GlobalConfigDO configDOglobalConfigMapper.selectOne(GlobalConfigDO::getKey,key);if(Objects.isNull(configDO)){returnCommonResult.success(configVo);}BeanUtils.copyProperties(configDO,configVo);returnCommonResult.success(configVo);}但是就是报SQL: SELECT id, key, value, deleted, create_time, update_time, creator, updater, x_channel, x_platform FROM system_global_config WHERE deleted 0 AND (key ?)Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘key, value, deleted, create_time, update_time, creator, xx,’ at line 1; bad SQL grammar []2025-12-23 16:53:55.138 | ERROR 7 | http-nio-48091-exec-7 [TID: N/A] | [USER_ID: 1950821235660029954] [USER_IP: 42.99.63.70] [X_CHANNEL: zp] [X_PLATFORM: middleAndroid] [DEVICE_ID: 123321] [VERSION: 1.1.0.0.1] [REQUEST_ID: 2f9275a4-c754-4122xxxa902-93c241c54947] | c.h.f.w.c.h.简单的说就是 使用key 、value 关键字mybatis自动生成的sql用不了会报错。尝试Override public RGlobalxxConfigVoqueryGlobalxxxConfigVoByKey(String key){LambdaQueryWrapperGlobalxxConfigDOwrappernew LambdaQueryWrapper();wrapper.eq(GlobalxxxConfigDO::getKey,key).eq(GlobalxxConfigDO::getDeleted,0);GlobalxxConfigDO configDOglobalxxConfigMapper.selectOne(wrapper);GlobalxxConfigVo configVonewGlobalxxxConfigVo();BeanUtils.copyProperties(configDO,configVo);returnR.success(configVo);}还是报错误最终写sql 做mapper映射解决bugselect xxx from xxx where xxx;2、response返回值封装触发关键字 isDef{code:220,data:[{config:1024x,isDef:true},{config:2048x,isDef:false}],msg:}正常封装对象Data NoArgsConstructor AllArgsConstructor public class GlobalxxxConfigVo{private String config;private boolean isDef;}写好后返回是{code:220,data:[{config:1024x,def:true},{config:2048x,def:false}],msg:}查询原因是问题分析在Java中使用Lombok的Data注解时对于布尔类型的字段Lombok生成的getter方法命名规则为如果是基本类型boolean字段名为isDef则生成的getter方法为isDef()setter方法为setDef(boolean)。但是在序列化为JSON时Jackson等序列化框架默认使用getter方法来确定字段名。对于布尔类型可能会产生混淆。字段名为isDefLombok生成的getter方法为isDef()setter为setDef(boolean)。序列化框架可能会将字段名解析为def因为getter方法名为isDef去掉is后首字母小写为def所以返回的JSON中出现了def字段。解决方案使用Jackson的JsonProperty注解指定序列化时的字段名。Data NoArgsConstructor AllArgsConstructor public class GlobalxxxConfigVo{/** * 视频彩铃分配率 */private String config;/** * 如果匹配默认的就是true 没有匹配到就是false */JsonProperty(isDef)private boolean isDef;}都是师傅学到了。。。。喜欢我的文章记得点个在看或者点赞持续更新中ing…