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

【Java踩坑笔记】44_数据库字段用保留字,MyBatis生成的SQL直接报错

44 | 数据库字段用保留字,MyBatis 生成的 SQL 直接报错

摘要:字段名叫orderstatusselect这些保留字,不转义直接拼 SQL 会报错。MySQL 用反引号转义,但很多人忘了写。


一、问题现象

-- 字段名叫 order(保留字),没转义CREATETABLEorders(idBIGINTPRIMARYKEY,orderVARCHAR(100)-- ❌ 保留字,报语法错误);

正确写法:

CREATETABLEorders(idBIGINTPRIMARYKEY,`order`VARCHAR(100)-- ✅ 反引号转义);

但 MyBatis 里如果直接写字段名,生成的 SQL 没反引号,依然报错。


二、踩坑现场

场景:实体字段名和保留字一样

// ❌ 实体字段名是 order,MyBatis 生成的 SQL 没反引号classOrder{privateStringorder;// 字段名 = 保留字}

MyBatis 生成 SQL:

INSERTINTOorders(order)VALUES('...');-- ❌ 报错

三、正确写法

3.1 数据库层:字段名避开保留字(最推荐)

-- ✅ 不要叫 order,叫 order_nameCREATETABLEorders(idBIGINTPRIMARYKEY,order_nameVARCHAR(100)-- ✅ 不是保留字);

3.2 MyBatis 里转义字段名

<!-- ✅ 用反引号包裹字段名(MySQL) --><insertid="insert">INSERT INTO orders (`order`) VALUES (#{order})</insert>

3.3 用@Column指定字段名(JPA 注解)

// ✅ JPA 注解方式classOrder{@Column(name="`order`")// 反引号包裹privateStringorder;}

3.4 全局配置 MyBatis 自动加反引号

# ✅ MyBatis-Plus 配置(3.4.0+)mybatis-plus:global-config:db-config:column-format:"`%s`"# 所有字段名自动加反引号

四、常见保留字清单

保留字说明替代名
order排序关键字order_namesort_order
select查询关键字selectedchoice
status部分数据库保留stateorder_status
desc降序关键字descriptiondesc_text
group分组关键字group_nameteam

五、最佳实践

✅ 数据库字段命名的 3 条铁律

  1. 字段名避开所有保留字(设计表时就注意)
  2. 如果必须用保留字,用反引号(MySQL)或双引号(PostgreSQL)转义
  3. MyBatis-Plus 开启column-format,自动加反引号

🔍 如何快速发现保留字字段?

-- MySQL:查看保留字清单SELECT*FROMinformation_schema.KEYWORDSWHEREreserved=1;

六、小结

  • 字段名叫保留字(orderselect…),SQL 直接报语法错误
  • MySQL 用反引号转义:`order`
  • 最推荐:设计表时避开保留字,不要给自己找麻烦
  • MyBatis-Plus 用column-format全局自动加反引号

第六辑完。—— 下一篇进入第七辑:日常开发技巧篇,首篇:toString里打印对象?小心无限递归栈溢出(本篇第26篇已讲,换一篇)。

:第26篇已讲过toString()递归问题,第七辑首篇改为:日志打印对象用toString,生产环境可能引发雪崩

更多资料一线大厂Java面试题合集

http://www.cnnetsun.cn/news/3389471.html

相关文章:

  • VS Code状态栏实时监控Claude API用量
  • LÖVE游戏AI实战:从A*寻路到行为树构建智能NPC
  • 为什么给 Agent 加记忆反而变差了:Tree-of-Experience 在金融预测中的经验管理教训
  • 中国大学生工程实践与创新能力竞赛(工程训练大赛)——智慧物流搬运小车 ④ 精准定位与姿态微调
  • D3KeyHelper:3分钟上手!暗黑3智能按键助手完全指南
  • 利用Python与GeoLite2数据库分析fail2ban攻击源地理位置
  • 51单片机中断优先级配置与中断嵌套实战解析
  • AI精解围棋名局:从星阵让先棋学习效率围棋思维
  • 超高速PCIe实时运动控制卡在精密五金件六面视觉筛选中的核心优势与方案解析
  • Boost电源DCR电流检测原理与LM5122ZA多相设计实战
  • 小学三年级奥数完整知识点清单(分模块+必学内容+难度分级)
  • 遗传算法工程实战:抗早熟、保可行、可验证的GA求解器设计
  • DRA75x串行接口时序设计:从参数解析到实战避坑指南
  • 小熊猫C++调试模式下输出换行异常:原理分析与解决方案
  • ESP8266智能插座硬件设计详解:从模块选型到PCB布局
  • 用 Claude 4.8 辅助学习:如何让 AI 变成你的知识讲解员?
  • C++并发哈希表实现:细粒度锁与读写锁优化高性能键值存储
  • PyTorch Tensor底层解密:内存布局、梯度机制与性能优化
  • OC免服约稿模式解析:小圈子信任经济下的高效创作合作
  • 集成运放篇:从电流源到差分放大的核心电路解析
  • 从Node到PHP:校友邦小程序签到加密算法的跨语言实现与迁移
  • 汽车照明光反馈系统设计:跨阻放大器原理与TPS99000-Q1实战
  • Unity ECS性能优化:Latios Framework核心模块实战指南
  • 影刀RPA 志愿者管理:活动报名与时长统计自动化
  • 离散制造转型误区三:别盲目上AI!智能化不是全覆盖,是点状破局
  • C++字符编码转换:宽字符与多字节字符的实战指南
  • 《大学英语4》听力真题解析与备考策略(四)
  • [Latex]公式排版进阶:多环境选择与实战避坑指南
  • 华为MetaERP SAP CO 三大成本核算模式全流程详解 —— 以生产 1 台重型卡车为例前置基础设定(统一案例数据,方便对比)业务场景生产1 台重型卡车(产成品卡车 Truck,S 计价标
  • 虚函数表:面试深挖时的杀手锏,懂这个直接拉开差距