SpringBoot+MyBatis Plus实现update_time字段自动更新详解
作者:奇妙智能
在 Spring Boot + MyBatis Plus 中实现 update_time
字段自动更新,可通过 MyBatis Plus 的自动填充(Auto Fill)功能 完成。以下是详细步骤:
步骤 1:添加依赖(若未添加)
确保项目中已引入 MyBatis Plus 核心依赖(Spring Boot 项目通常已集成):
<!-- pom.xml --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> <!-- 推荐 3.3.0+ 版本 --> </dependency>
步骤 2:实体类配置
在需要自动更新的 update_time
字段上添加 @TableField
注解,并指定填充策略为 FieldFill.UPDATE
。
示例实体类:
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.time.LocalDateTime; @TableName("your_table") // 对应数据库表名 public class YourEntity { // 其他字段... /** * 更新时间(自动填充) */ @TableField(fill = FieldFill.UPDATE) // 关键注解:更新时自动填充 private LocalDateTime updateTime; }
FieldFill.UPDATE
:表示该字段仅在 更新操作 时自动填充。
若需 插入和更新时都填充,可使用 FieldFill.INSERT_UPDATE
。
步骤 3:实现元对象处理器(MetaObjectHandler)
创建一个类实现 MetaObjectHandler
接口,重写 updateFill
方法,定义更新时的填充逻辑(如设置当前时间)。
示例代码:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component // 必须注册为 Bean public class MyMetaObjectHandler implements MetaObjectHandler { /** * 更新时自动填充(覆盖 updateFill 方法) */ @Override public void updateFill(MetaObject metaObject) { // 设置 update_time 为当前时间(无需手动调用,MP 自动处理) this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 或使用更灵活的非严格模式(推荐,避免字段不存在时报错) // this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); } }
strictInsertFill
:严格模式,仅当字段存在且值为 null
时填充(可能抛异常,谨慎使用)。
fillStrategy
:非严格模式,直接填充(推荐,兼容性更好)。
步骤 4:验证自动填充效果
使用 MyBatis Plus 提供的更新方法(如 updateById
、update
),无需手动设置 updateTime
,MP 会自动填充当前时间。
示例更新操作:
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service public class YourServiceImpl extends ServiceImpl<YourMapper, YourEntity> implements YourService { @Override public boolean updateEntity(YourEntity entity) { // 只需设置需要更新的字段(如 name),updateTime 会自动填充 entity.setName("新名称"); // 调用 MP 的更新方法(基于主键更新) return this.updateById(entity); } }
注意事项
1.数据库字段类型:确保数据库中 update_time
字段类型与 Java 类型匹配(如 datetime
、timestamp
或 bigint
存储时间戳)。
- 若使用
LocalDateTime
,数据库建议用datetime
(MySQL 5.6.5+ 支持)或timestamp
。 - 若需兼容旧版 MySQL(5.6 以下),可改用
bigint
存储时间戳(毫秒级),并在填充时使用System.currentTimeMillis()
。
2.自定义 SQL 场景:若使用自定义 SQL(如 XML 或 @Update
注解),需手动在 SQL 中添加 update_time = NOW()
(或通过 MP 自动填充)。
示例(XML 自定义更新):
<update id="customUpdate"> UPDATE your_table SET name = #{name}, update_time = NOW() <!-- 手动添加 --> WHERE id = #{id} </update>
3.时区问题:若服务器时区与业务时区不一致,需统一时区配置(如 application.yml
中设置 spring.jackson.time-zone=Asia/Shanghai
)。
总结
通过 MyBatis Plus 的 @TableField(fill = FieldFill.UPDATE)
注解和 MetaObjectHandler
元对象处理器,可轻松实现 update_time
字段的自动更新,无需手动干预。核心是注解标记字段 + 处理器定义填充逻辑 + 使用 MP 内置更新方法。
到此这篇关于SpringBoot+MyBatis Plus实现update_time字段自动更新详解的文章就介绍到这了,更多相关SpringBoot MyBatis Plus字段更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!