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);
            }
        }
    }
}
相关推荐
麻瓜code1 小时前
双写一致性:为什么是“删缓存“,而不是“改缓存“
java·缓存·mybatis
郭小李20 小时前
mybatis 动态 sql
java·sql·mybatis
知守观20 小时前
技术考古:iBATIS 2.3.4 时代的持久层,是如何用 Map 玩转 307 个存储过程的?
java·后端·mybatis
captain37621 小时前
MyBatis Plus(1)
java·服务器·mybatis
代码不停1 天前
MyBatis进阶
spring boot·mybatis
captain3762 天前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
captain3762 天前
MyBatis(进阶1)
mybatis
郭小李2 天前
mybatis的 Mapper.xml语法
xml·java·mybatis
m0_639906942 天前
MyBatis 实现分页查询|逻辑分页、物理分页、PageHelper 原理
mybatis
captain3763 天前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis