【避坑指南】MyBatis插入员工密码为空一个字段引发的困惑关键词MyBatis插入密码为空、数据库默认值被覆盖、SQL字段冗余、后端开发避坑适用人群Java后端开发者、MyBatis使用者、正在被“神秘空值”困扰的你阅读时间5分钟帮你省下2小时排查时间 问题现象说好的默认密码呢最近在开发员工管理模块时遇到一个“灵异事件”数据库表emp的password字段已设置默认值用 DataGrip 直接执行 INSERT 语句不指定 password密码正常写入默认值 ✅但通过后端接口添加员工时数据库里 password 竟然是 NULL ❌Apifox 调用时未传 password 参数业务设计新员工密码由系统初始化瞬间懵圈数据库默认值“失效”了 排查过程抽丝剥茧找真凶第一步检查数据库password varchar(32) default 123456 comment 密码, -- 确认 password 字段有 DEFAULT 值✅ 数据库设置无误第二步检查后端插入SQL关键⚠️问题锁定SQL 中显式包含了password字段第三步还原现场Apifox 调用时未传password→Emp对象中passwordnullMyBatis 将null作为值插入password字段数据库规则显式插入NULL会覆盖字段默认值就像填表格时你亲手写了个“空”系统就不会帮你填默认内容了 根本原因一句话总结SQL 语句中“多写”了 password 字段 前端未传值 MyBatis 插入 NULL → 覆盖数据库默认值这不是 Bug是 SQL 设计与业务逻辑不匹配导致的“预期之外的结果”️ 解决方案直接移除冗余字段password,#{password}Insert(insert into emp(username, name, gender, phone, job, salary, image, entry_date, dept_id, create_time, update_time) values( #{username}, #{name}, #{gender}, #{phone}, #{job}, #{salary}, #{image}, #{entryDate}, #{deptId}, #{createTime}, #{updateTime}))适用场景密码由数据库默认值或后端统一初始化前端无需传✅ 效果插入时完全不涉及 password 字段 → 数据库自动使用 DEFAULT 值 预防指南下次不再踩坑环节建议SQL 编写有默认值的字段若不由前端传插入语句中直接省略代码审查重点检查 INSERT 语句字段与业务逻辑是否匹配接口文档明确标注哪些字段“系统自动生成”避免前端误传/漏传单元测试模拟“不传 password场景验证数据库实际写入值日志增强插入后打印关键字段脱敏快速定位异常这个小问题背后藏着两个重要认知数据库默认值 ≠ 万能保险显式插入 NULL 会覆盖它SQL 字段不是“写得越多越好”每个字段都应有明确业务意义开发中多问一句“这个字段真的需要前端传吗”能避开80%的类似坑互动时间你是否也遇到过“默认值被覆盖”的坑欢迎在评论区分享你的故事如果本文帮到你点赞收藏关注三连是对创作者最大的鼓励✨