MyBatis-Plus 默认情况下会根据字段的值是否为 null 来决定是否生成对应的 UPDATE 语句。这是由 更新策略 决定的,默认的行为是 忽略 null 值,即如果字段值为 null,该字段将不会出现在 UPDATE 语句中。
默认行为分析
MyBatis-Plus 默认的 FieldStrategy 配置如下:
FieldStrategy.NOT_NULL(默认):
当字段值为 null 时,UPDATE 语句中会忽略该字段。
这是为了避免不必要地将字段更新为 null,从而减少对现有数据的意外影响。
FieldStrategy.IGNORED:
忽略字段值是否为 null,即使为 null 也会生成对应的 UPDATE 语句。
FieldStrategy.NOT_EMPTY:
对于字符串,只有当字段值非空(!= “”)时,才会生成 UPDATE 语句;对于其他类型,行为类似于 NOT_NULL。
如何更新 null 值
如果需要更新字段为 null,有以下几种解决方法:
- 针对字段设置 FieldStrategy.IGNORED
在实体类的字段上,使用 @TableField 注解并指定 updateStrategy 为
FieldStrategy.IGNORED:@TableField(updateStrategy = FieldStrategy.IGNORED)
private String facilities;
这样即使 facilities 为 null,UPDATE 语句中也会包含它。
- 修改全局更新策略
如果你希望全局都允许 null 值更新,可以在 MyBatis-Plus 配置中调整全局 update-
strategy:
application.yml:
mybatis-plus:global-config:db-config:update-strategy: ignored
这会使所有字段在更新时忽略值是否为 null。
- 使用手动 SQL 强制更新
可以直接在 Mapper 接口中编写手动 SQL,确保字段被强制更新:
@Update(“UPDATE cm_ci_em_info SET facilities = #{facilities} WHERE id = #{id}”)
void updateFacilities(@Param(“id”) String id, @Param(“facilities”) String facilities);
这种方式可以完全控制 UPDATE 语句的生成逻辑。
- 使用动态 SQL
如果需要更精细地控制更新逻辑,可以在 Mapper 的 XML 文件中使用动态 SQL。例如:
<update id="updateById">UPDATE cm_ci_em_info<set><if test="facilities != null">facilities = #{facilities},</if><if test="facilities == null">facilities = NULL,</if></set>WHERE id = #{id}
</update>
示例对比
实体字段为 null 的更新效果
以下是 FieldStrategy 的不同配置对应的 SQL 行为:
默认 NOT_NULL(默认策略):
实体 facilities = null:
UPDATE cm_ci_em_info SET model_id = ? WHERE id = ?
FieldStrategy.IGNORED(忽略 null 检查):
实体 facilities = null:
UPDATE cm_ci_em_info SET facilities = NULL, model_id = ? WHERE id = ?
总结
默认情况下,MyBatis-Plus 会忽略值为 null 的字段,不生成 UPDATE 语句。如果你需要更新字段为 null:
对字段单独配置 @TableField(updateStrategy = FieldStrategy.IGNORED)。
修改全局策略 update-strategy 为 ignored。
编写手动 SQL 强制更新。
使用动态 SQL 明确处理 null 值的更新逻辑