mybatis-plus 对于属性为null字段不更新

MyBatis-Plus 默认情况下会根据字段的值是否为 null 来决定是否生成对应的 UPDATE 语句。这是由 更新策略 决定的,默认的行为是 忽略 null 值,即如果字段值为 null,该字段将不会出现在 UPDATE 语句中。

默认行为分析

MyBatis-Plus 默认的 FieldStrategy 配置如下:

java 复制代码
FieldStrategy.NOT_NULL(默认):

当字段值为 null 时,UPDATE 语句中会忽略该字段。

这是为了避免不必要地将字段更新为 null,从而减少对现有数据的意外影响。

java 复制代码
FieldStrategy.IGNORED:

忽略字段值是否为 null,即使为 null 也会生成对应的 UPDATE 语句。

java 复制代码
FieldStrategy.NOT_EMPTY:

对于字符串,只有当字段值非空(!= "")时,才会生成 UPDATE 语句;对于其他类型,行为类似于 NOT_NULL。

如何更新 null 值

如果需要更新字段为 null,有以下几种解决方法:

  1. 针对字段设置 FieldStrategy.IGNORED
    在实体类的字段上,使用 @TableField 注解并指定 updateStrategy 为
java 复制代码
FieldStrategy.IGNORED:

@TableField(updateStrategy = FieldStrategy.IGNORED)
private String facilities;

这样即使 facilities 为 null,UPDATE 语句中也会包含它。

  1. 修改全局更新策略
    如果你希望全局都允许 null 值更新,可以在 MyBatis-Plus 配置中调整全局 update-
java 复制代码
strategy:
application.yml:
mybatis-plus:
  global-config:
    db-config:
      update-strategy: ignored

这会使所有字段在更新时忽略值是否为 null。

  1. 使用手动 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 语句的生成逻辑。

  1. 使用动态 SQL
    如果需要更精细地控制更新逻辑,可以在 Mapper 的 XML 文件中使用动态 SQL。例如:
java 复制代码
<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:

java 复制代码
UPDATE cm_ci_em_info SET model_id = ? WHERE id = ?

FieldStrategy.IGNORED(忽略 null 检查):

实体 facilities = null:

java 复制代码
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 值的更新逻辑

相关推荐
侠客行03175 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪5 小时前
深入浅出LangChain4J
java·langchain·llm
老毛肚7 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎8 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Yvonne爱编码8 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚8 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂8 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
fuquxiaoguang8 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
琹箐8 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
__WanG8 小时前
JavaTuples 库分析
java