【Java踩坑笔记】44_数据库字段用保留字,MyBatis生成的SQL直接报错
44 | 数据库字段用保留字,MyBatis 生成的 SQL 直接报错
摘要:字段名叫
order、status、select这些保留字,不转义直接拼 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_name、sort_order |
select | 查询关键字 | selected、choice |
status | 部分数据库保留 | state、order_status |
desc | 降序关键字 | description、desc_text |
group | 分组关键字 | group_name、team |
五、最佳实践
✅ 数据库字段命名的 3 条铁律
- 字段名避开所有保留字(设计表时就注意)
- 如果必须用保留字,用反引号(MySQL)或双引号(PostgreSQL)转义
- MyBatis-Plus 开启
column-format,自动加反引号
🔍 如何快速发现保留字字段?
-- MySQL:查看保留字清单SELECT*FROMinformation_schema.KEYWORDSWHEREreserved=1;六、小结
- 字段名叫保留字(
order、select…),SQL 直接报语法错误 - MySQL 用反引号转义:
`order` - 最推荐:设计表时避开保留字,不要给自己找麻烦
- MyBatis-Plus 用
column-format全局自动加反引号
第六辑完。—— 下一篇进入第七辑:日常开发技巧篇,首篇:toString里打印对象?小心无限递归栈溢出(本篇第26篇已讲,换一篇)。
注:第26篇已讲过
toString()递归问题,第七辑首篇改为:日志打印对象用toString,生产环境可能引发雪崩。
更多资料:一线大厂Java面试题合集
