你的浏览器不支持canvas

做你害怕做的事情,然后你会发现,不过如此。

MyBatis-Plus使用MetaObjectHandler填充公共字段

时间: 作者: 黄运鑫

本文章属原创文章,未经作者许可,禁止转载,复制,下载,以及用作商业用途。原作者保留所有解释权。


使用场景

  • 公共字段createTimecreateUserupdateTimeupdateUser自动填充
  • 特殊需求字段保存前处理数据,比如可以通过反射处理特定注解的字段

实现

/**
 * 实体类
 */
@Data
@TableName("gecco_user")
@ApiModel(value = "User对象", description = "User对象")
public class Role implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 审核状态
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "审核状态")
    private String checkStatus;
}
  • FieldFill.INSERT_UPDATE表示新增或更新时填充,FieldFill的其他策略如下:
/**
 * 字段填充策略枚举类
 *
 * <p>
 * 判断注入的 insert 和 update 的 sql 脚本是否在对应情况下忽略掉字段的 if 标签生成
 * <if test="...">......</if>
 * 判断优先级比 {@link FieldStrategy} 高
 * </p>
 *
 * @author hubin
 * @since 2017-06-27
 */
public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入时填充字段
     */
    INSERT,
    /**
     * 更新时填充字段
     */
    UPDATE,
    /**
     * 插入和更新时填充字段
     */
    INSERT_UPDATE
}
  • 创建字段填充控制器,实现MetaObjectHandler,使用@Component@Bean注入,代码如下:
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 新增时填充
     */
    public void insertFill(MetaObject metaObject) {
        //获取所有gat字段名
        String[] getterNames = metaObject.getGetterNames();
        //获取所有set字段名
        String[] setterNames = metaObject.getSetterNames();
        //获取指定字段的值
        Object checkStatus = this.getFieldValByName("checkStatus", metaObject);

        //修改指定字段赋值
        this.setFieldValByName("checkStatus", "AUDIT", metaObject);
        // 或者
        this.strictInsertFill(metaObject, "checkStatus", String.class, "AUDIT"); // 起始版本 3.3.0(推荐使用)
        // 或者
        this.strictInsertFill(metaObject, "checkStatus", () -> "AUDIT", String.class); // 起始版本 3.3.3(推荐)


        //获取entity实体
        Object originalObject = metaObject.getOriginalObject();
        //通过反射获取实体字段
        Field[] fields = ReflectUtil.getFields(originalObject.getClass());
        for (Field field : fields) {
            //获取实体字段注解
            TableField annotation = field.getAnnotation(TableField.class);
            if (annotation != null) {
                //通过反射设置值
                ReflectUtil.setFieldValue(originalObject, field, "AUDIT");
            }
        }
    }

    /**
     * 更新时填充
     */
    public void updateFill(MetaObject metaObject) {
    }
}

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。