You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis Generator中insert与insertSelective的区别及空属性场景疑问

MyBatis Generator中insert与insertSelective的区别

核心差异

  • insert方法:生成的SQL会包含实体类的所有字段,不管对应属性是否为null。执行时会把所有字段(包括null值的)都写入数据库,会直接覆盖对应字段的数据库默认值(如果有定义的话)。
  • insertSelective方法:生成的SQL会通过MyBatis的<if test>判断属性是否非null,只将非null的字段加入INSERT语句中。null值对应的字段不会出现在SQL里,数据库会按照自身规则处理这些字段(比如使用字段默认值、自增生成值等)。

针对你的示例分析

假设数据库user表的id是自增主键(有默认自增规则),address字段设置了默认值'未知地址':

  • 调用insert(User{null,"Jack",null})时,生成的SQL是:
INSERT INTO user (id, name, address) VALUES (?, ?, ?)

传入参数null, 'Jack', null后,id会被强制设为null(若数据库不允许主键为null则报错,自增主键场景下直接违反规则),address会被设为null,覆盖数据库默认值。

  • 调用insertSelective(User{null,"Jack",null})时,生成的SQL是:
INSERT INTO user (name) VALUES (?)

仅传入参数'Jack',id由数据库自增规则自动生成数值,address会使用数据库设置的默认值'未知地址'。

即使数据库字段无默认值且允许为null,两者底层逻辑仍有区别:insert是显式插入null,insertSelective是不处理该字段,由数据库自行判定设为null。

内容的提问来源于stack exchange,提问作者Name Null

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:15:51