36人参与 • 2025-06-11 • Java
在使用 mybatis plus 时,通常我们会在数据库表中设置 create_time 和 update_time 两个字段,借助 mybatis plus 的 自动填充功能 来维护这些时间字段。
但是,有时候你可能会遇到 update_time 字段未自动更新的情况,哪怕代码中已经配置了 metaobjecthandler。本文将针对这一问题,分析可能的原因,并提供详细的解决方案。
假设我们有如下的 updatefill() 方法:
@override
public void updatefill(metaobject metaobject) {
log.info("执行更新填充...");
this.strictinsertfill(metaobject, "updatetime", timestamp.class, timestamp.valueof(localdatetime.now()));
this.strictinsertfill(metaobject, "updateby", biginteger.class, userid);
}但是执行更新操作后:
update_time 字段未更新updatetime 依然是旧值updateby 可能也未更新接下来我们来分析可能的原因。
1. 使用了 strictinsertfill/strictupdatefill 导致更新失效
原因:
strictinsertfill/strictupdatefill 主要用于插入数据时的自动填充。即使在 updatefill() 中使用它,也不会生效。
原理解释:
strictinsertfill/strictupdatefill 的作用是 如果字段已有值则不会覆盖,而在更新场景中,一般实体对象中 update_time 已有值。
解决方案:
将 strictinsertfill/strictupdatefill 替换为 setfieldvalbyname:
@override
public void updatefill(metaobject metaobject) {
log.info("start update fill ....");
this.setfieldvalbyname("updatetime", timestamp.valueof(localdatetime.now()), metaobject);
this.setfieldvalbyname("updateby", userid, metaobject);
}原因分析补充:
strictinsertfill/strictupdatefill → 插入/更新数据时填充,不适用于更新场景。setfieldvalbyname → 更新数据时直接覆盖字段值,即使原值存在。2. 实体类注解配置错误
原因:
实体类中的字段没有正确标注 @tablefield(fill = fieldfill.insert_update),导致自动填充机制无法生效。
解决方案:
在实体类中正确设置注解:
import com.baomidou.mybatisplus.annotation.fieldfill;
import com.baomidou.mybatisplus.annotation.tablefield;
import lombok.data;
import java.time.localdatetime;
@data
public class user {
private long id;
private string name;
@tablefield(fill = fieldfill.insert)
private localdatetime createtime;
@tablefield(fill = fieldfill.insert_update)
private localdatetime updatetime;
@tablefield(fill = fieldfill.insert_update)
private biginteger updateby;
}注意:
fieldfill.insert_update:用于插入和更新时自动填充。3. metaobjecthandler 未生效
原因:
metaobjecthandler 需要被 spring 管理。如果没有加上 @component 注解或没有被扫描到,自动填充方法不会执行。
解决方案:
确保 fieldautofillhandler 类上有 @component 注解:
import com.baomidou.mybatisplus.core.handlers.metaobjecthandler;
import lombok.extern.slf4j.slf4j;
import org.apache.ibatis.reflection.metaobject;
import org.springframework.stereotype.component;
@slf4j
@component
public class fieldautofillhandler implements metaobjecthandler {
@override
public void insertfill(metaobject metaobject) {
log.info("执行插入填充...");
this.setfieldvalbyname("createtime", localdatetime.now(), metaobject);
this.setfieldvalbyname("updatetime", localdatetime.now(), metaobject);
}
@override
public void updatefill(metaobject metaobject) {
log.info("执行更新填充...");
this.setfieldvalbyname("updatetime", localdatetime.now(), metaobject);
}
}注意:
如果项目中有多个 metaobjecthandler,需要确保不会有冲突。
4. 使用自定义 sql 导致自动填充失效
原因:
如果你在 mapper.xml 中自定义了 update 语句,那么 mybatis plus 不会触发自动填充逻辑。
解决方案:
方法 1:在 xml 中手动设置 update_time 字段:
<update id="updateuser" parametertype="com.example.entity.user">
update user
set name = #{name},
update_time = now(),
update_by = #{updateby}
where id = #{id}
</update>方法 2:直接使用 basemapper 提供的 updatebyid() 等方法,mybatis plus 会自动触发填充:
user user = usermapper.selectbyid(1l);
user.setname("李四");
usermapper.updatebyid(user);5. 字段类型不匹配
原因:
数据库中 update_time 的数据类型与 java 实体类的类型不匹配,导致填充失败。
解决方案:
确保数据库字段类型和实体类一致:
alter table user modify update_time timestamp null default null;
private localdatetime updatetime;
注意:
localdatetime 处理时间字段是最佳实践。datetime 或 timestamp,不要使用 string 类型。| 原因 | 现象 | 解决方法 |
|---|---|---|
使用了 strictinsertfill | update_time 未更新 | 使用 setfieldvalbyname 替代 |
| 实体类注解错误 | 自动填充无效 | 确保字段上加了 @tablefield(fill = fieldfill.insert_update) |
metaobjecthandler 未生效 | updatefill() 不执行 | 确保加上 @component 注解 |
| 使用自定义 sql 覆盖了默认方法 | 填充逻辑未触发 | 使用 basemapper.updatebyid() 或在 sql 中手动填充 |
| 数据类型不匹配 | 字段更新失败 | 数据库字段使用 timestamp 且实体类使用 localdatetime |
最终推荐的 updatefill() 写法如下:
@override
public void updatefill(metaobject metaobject) {
log.info("执行更新填充...");
this.setfieldvalbyname("updatetime", localdatetime.now(), metaobject);
this.setfieldvalbyname("updateby", userid, metaobject);
}通过这种方式,确保 update_time 字段在更新时自动更新,同时避免了不必要的填充失效问题。
到此这篇关于mybatis plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)的文章就介绍到这了,更多相关mybatis plus update_time 自动填充失效内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论