news 2026/4/17 6:30:12

mybatis-plus保存数据实现公共字段自动填充

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mybatis-plus保存数据实现公共字段自动填充

公共的实体类如下:

import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.zhou.common.utils.SessionUtil; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * 通用实体基类 * <p> * 提供实体类的通用字段,包括主键ID、创建时间、更新时间、创建人、更新人等。 * 配合 MyBatis-Plus 的自动填充功能,在插入和更新时自动填充相关字段。 * </p> * * <p>主要功能:</p> * <ul> * <li>主键:使用String类型的UUID</li> * <li>时间字段:创建时间和更新时间,支持JSON格式化输出</li> * <li>用户字段:创建人和更新人,记录操作者信息</li> * <li>表格序号:用于前端表格显示的行号,不存储到数据库</li> * </ul> * * <p>自动填充策略:</p> * <p>通过 MyBatis-Plus 的 {@link FieldFill#INSERT_UPDATE} 配置, * 在数据插入和更新时自动填充时间和用户字段。</p> * * @author lang.zhou * @see FieldFill * @see SessionUtil */ @Data public class CommonBean implements Serializable { /** 序列化版本号 */ private static final long serialVersionUID = 1L; /** * 主键ID * <p> * 使用String类型的UUID作为主键,保证全局唯一性。 * </p> */ @ApiModelProperty(value = "主键") @TableField("id") private String id; /** * 创建时间 * <p> * 记录数据的首次创建时间,通过 MyBatis-Plus 自动填充。 * JSON序列化时格式为 "yyyy-MM-dd HH:mm:ss"。 * </p> */ @ApiModelProperty(value = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "create_time",fill = FieldFill.INSERT_UPDATE) private Date createTime; /** * 更新时间 * <p> * 记录数据的最后修改时间,通过 MyBatis-Plus 自动填充。 * JSON序列化时格式为 "yyyy-MM-dd HH:mm:ss"。 * </p> */ @ApiModelProperty(value = "修改时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE) private Date updateTime; /** * 创建人 * <p> * 记录数据的创建者,通常为当前登录用户的组织机构ID。 * 通过 MyBatis-Plus 自动填充。 * </p> */ @ApiModelProperty(value = "创建人") @TableField(value = "create_user",fill = FieldFill.INSERT_UPDATE) private String createUser; /** * 更新人 * <p> * 记录数据的最后修改者,通常为当前登录用户的组织机构ID。 * 通过 MyBatis-Plus 自动填充。 * </p> */ @ApiModelProperty(value = "修改人") @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE) private String updateUser; }

通过实现MetaObjectHandler接口来实现:

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.zhou.common.model.CommonBean; import com.zhou.common.utils.SessionUtil; import com.zhou.util.StringTool; import org.apache.ibatis.reflection.MetaObject; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import java.util.Date; /** * 公共字段自动填充处理器 * <p> * 实现 MyBatis-Plus 的 {@link MetaObjectHandler} 接口, * 用于在数据插入和更新时自动填充 {@link CommonBean} 的公共字段。 * </p> * * <p>自动填充字段:</p> * <ul> * <li>插入时:id、createTime、updateTime、createUser、updateUser</li> * <li>更新时:updateTime、updateUser</li> * </ul> * * <p>填充规则:</p> * <ul> * <li>id:插入时若为空则自动生成UUID</li> * <li>createTime:插入时若为空则设置为当前时间</li> * <li>updateTime:插入时同步createTime,更新时设置为当前时间</li> * <li>createUser:插入时若为空则设置为当前登录用户ID</li> * <li>updateUser:插入和更新时都设置为当前登录用户ID</li> * </ul> * * @author lang.zhou * @see MetaObjectHandler * @see CommonBean * @see SessionUtil */ @Primary @Component public class CommonColumnHandler implements MetaObjectHandler { /** * 插入操作时的字段自动填充 * <p> * 当实体对象为 {@link CommonBean} 类型时,自动填充以下字段: * </p> * <ul> * <li>id:若为空则生成UUID</li> * <li>createTime:若为空则设置为当前时间</li> * <li>updateTime:同步设置为createTime的值</li> * <li>createUser:若为空且当前用户存在则设置为用户ID</li> * <li>updateUser:设置为当前用户ID</li> * </ul> * <p>大量插入数据时,自动填充会大幅降低插入速度</p> * * @param metaObject MyBatis元对象,包含原始实体对象信息 */ @Override public void insertFill(MetaObject metaObject) { if(metaObject.getOriginalObject() instanceof CommonBean){ String orgId = SessionUtil.currentOrgId(); CommonBean bean = (CommonBean) metaObject.getOriginalObject(); if(bean.getCreateTime() == null){ bean.setCreateTime(new Date()); } bean.setUpdateTime(bean.getCreateTime()); if(StringTool.isNotBlank(orgId)){ if(StringTool.isBlank(bean.getCreateUser())){ bean.setCreateUser(orgId); } bean.setUpdateUser(orgId); } if(StringTool.isBlank(bean.getId())){ bean.setId(StringTool.uuid()); } } } /** * 更新操作时的字段自动填充 * <p> * 当实体对象为 {@link CommonBean} 类型时,自动填充以下字段: * </p> * <ul> * <li>updateTime:设置为当前时间</li> * <li>updateUser:若当前用户存在则设置为用户ID</li> * </ul> * * @param metaObject MyBatis元对象,包含原始实体对象信息 */ @Override public void updateFill(MetaObject metaObject) { if(metaObject.getOriginalObject() instanceof CommonBean){ CommonBean bean = (CommonBean) metaObject.getOriginalObject(); bean.setUpdateTime(new Date()); String orgId = SessionUtil.currentOrgId(); if(StringTool.isNotBlank(orgId)){ bean.setUpdateUser(orgId); } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 6:22:36

ChatGPT、Midjourney背后的秘密:3个生活例子,小白秒懂大模型!

你是不是也经常听到或者在朋友圈、短视频里刷到“大模型”、“AI大模型”这些词&#xff1f; 第一反应是不是&#xff1a;“这是程序员才要懂的高科技吧&#xff1f;跟我每个月拿固定工资的普通人有什么关系&#xff1f;” 其实完全不是。 你现在用的 ChatGPT 写周报、用 Mi…

作者头像 李华
网站建设 2026/4/17 6:21:39

Day02 优化版|阿里云ACP大模型解决方案专家

文章目录Day02 优化版&#xff5c;阿里云ACP大模型解决方案专家今日核心目标一、30min&#xff5c;RAG优化核心考点&#xff08;ACP必背&#xff09;1. 文档切分优化2. 检索策略优化3. 向量相关优化4. 生成环节优化二、25min&#xff5c;阿里云百炼平台 RAG 实操流程&#xff0…

作者头像 李华
网站建设 2026/4/17 6:21:08

告别低效选品!Open Claw 1688接口实战,轻松搭建全自动选品监控体系

电商选品的核心竞争力&#xff0c;从来不是“找得到货”&#xff0c;而是“找得快、盯得准、拿得稳”。不管是无货源店群、跨境电商&#xff0c;还是传统电商铺货&#xff0c;几乎所有从业者都面临一个共性难题&#xff1a;选品效率低、监控不及时、货源不稳定。每天花费大量时…

作者头像 李华