当前位置: 首页 > 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.jsqmd.com/news/1191707/

相关文章:

  • 【ChatGPT定价策略深度解密】:20年SaaS产品老兵拆解OpenAI 5次调价背后的成本模型、客户分层与ARPU阈值
  • 五次方程的OSOS结构识别与三次枢纽方程剥离方法
  • 从标准到应用:AVS3与H.265/HEVC视频编解码技术深度对比
  • 【Redis八股|第10篇】Spring Boot 项目整合 Redis 实战
  • C++跨平台剪贴板操作:纯头文件实现与多系统API详解
  • 从《论新阶段》到“活的灵魂”:毛泽东思想核心要义与当代技术创新的思想启迪
  • C++ WinInet实现高效HTTP文件下载:断点续传与多线程优化
  • 2026年7月最新嘉兴美度官方售后客服电话及服务网点地址查询 - 亨得利钟表维修中心
  • WorkBuddy 连接百度网盘:能查能上传,但别指望 AI 帮你下载
  • AWR1843BOOST毫米波雷达在自动泊车系统中的优势与实现
  • 影刀RPA 影刀中的SQL查询大全:从简单查询到多表联查
  • Midscene.js框架(5):测试报告系统与调试技巧
  • 第二章 温度、热量与能量(四)---焓
  • 为什么你的Claude脚本总要人工重写?深度拆解Prompt熵值与代码可执行性之间的3个数学阈值(基于217个真实case统计)
  • 从GESP五级真题解析C++算法思维:有趣的数字和问题
  • 模型监控仪表盘实战:从数据漂移到服务延迟的五维健康监测
  • Cocos Creator 3.8.6 游戏快速上架微信小游戏全流程实战指南
  • 2026工作总结工具哪家好用?5款AI工具实测对比,告别无效熬夜写总结
  • 【电路实战】MOS管缓启动电路的设计要点与参数计算
  • C++20 Ranges实战:filter与transform高效用法与性能优化
  • TI CC2640R2L蓝牙5.1 MCU:超低功耗物联网设计全解析
  • 影刀RPA 影刀流程的单元测试方法:不靠试跑靠验证
  • MSP430F676x1A外设配置与低功耗设计实战指南
  • GPT-4o原生语音架构解析:多模态实时交互的技术本质
  • Matlab实战:数据预处理的完整流程与核心技巧
  • 从流到帧:拆解TCP粘包拆包与HTTP/1.1的边界协议设计
  • TI TPS6594-Q1 ESM模块深度解析:电平与PWM模式配置及功能安全实践
  • LangChain--07智能体----Agent的基本用法
  • C++多线程数据竞争:从检测工具到修复模式的完整指南
  • 热成像技术开发实战:从原理到Python代码实现