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

📅 2026/7/15 5:36:39 👁️ 阅读次数 📝 编程学习
【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面试题合集