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

公共的实体类如下:

java 复制代码
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接口来实现:

java 复制代码
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);
            }
        }
    }
}
相关推荐
敲个大西瓜12 天前
mybatis拦截器插件实现数据库字段加解密
mybatis
武子康12 天前
Java-28 深入浅出 Spring 实现简易Ioc-04 在上节的业务下手动实现AOP
java·后端·mybatis
一条泥憨鱼12 天前
苍穹外卖【day6|微信登录与商品浏览功能】
后端·mybatis·苍穹外卖
vx-Biye_Design12 天前
springboot安阳地区研学旅游服务小程序-计算机毕业设计源码12785
java·vue.js·windows·spring boot·tomcat·maven·mybatis
摇滚侠12 天前
MyBatis+Spring+SpringMVC SSM 整合 179-185
java·spring·mybatis
摇滚侠12 天前
MyBatis+Spring+SpringMVC SSM ContextLoaderListener 177-178
java·spring·mybatis
Spring小子13 天前
【Spring Boot + Vue + DeepSeek】从零打造一个AI驱动的智能健康分析系统
java·spring boot·mybatis
武子康13 天前
Java-27 深入浅出 Spring - 实现简易Ioc-03 在上节的业务下手动实现IoC 从 XML 配置到 BeanFactory 反射注入
java·后端·mybatis
柏舟飞流13 天前
Spring Boot 进阶实战:整合 MyBatis、Redis、JWT,搭一个更像真实项目的后端服务
spring boot·redis·mybatis