zoukankan      html  css  js  c++  java
  • 【MyBatis-Plus】实现字段自动填充功能

    在项目中,我们有一些公共的字段需要做修改
    如:

    1. gmt_create:创建时间
    2. creator_id:创建人
    3. gmt_modified:修改时间
    4. modifier_id:修改人

    这时候我们可以采用 MyBatis-Plus 中的字段自动填充功能去实现

    思路:抽取公用字段封装到BaseEntity类中,再将使用到此公共字段的类继承基类,最后由 MyBatis-Plus 帮我们实现自动填充,这样我们便可以在service服务类中减少一定代码重复量!

    二、实现

    1. 实体类
    @Data
    @TableName("t_user")
    public class User extends BaseEntity<User> {
    
        private static final long serialVersionUID = 1L;
    
        @TableId(value = "id", type = IdType.AUTO)
        private Integer id;
     
        @TableField("username")
        private String username;
        
        @Override
        protected Serializable pkVal() {
            return this.id;
        }
    }

    2. 公用字段 - 使用注解填充字段,如:@TableField(fill = FieldFill.INSERT)

    @Getter
    @Setter
    public abstract class BaseEntity<T extends Model> extends Model {
        /**
         * 创建日期 - 现在时表示主动创建
         */
        @TableField(value = "gmt_create", fill = FieldFill.INSERT)
        private Date gmtCreate;
        /**
         * 修改时间 - 过去分词表示被动更新
         */
        @TableField(value = "gmt_modified", fill = FieldFill.INSERT_UPDATE)
        private Date gmtModified;
    }

    3. 自定义MyMetaObjectHandler字段自动填充处理类继承MetaObjectHandler

    /**
     *  <p> MyBatisPlus自定义字段自动填充处理类 - 实体类中使用 @TableField注解 </p>
     *
     * @description: 注意前端传值时要为null
     * @author: zhengqing
     * @date: 2019/8/18 0018 1:46
     */
    @Component
    public class MyMetaObjectHandler extends MetaObjectHandler {
    
        private static final Logger LOG = LoggerFactory.getLogger(MyMetaObjectHandler.class);
    
        /**
         * 创建时间
         */
        @Override
        public void insertFill(MetaObject metaObject) {
            LOG.info(" -------------------- start insert fill ...  --------------------");
            if (metaObject.hasGetter("gmtCreate") && metaObject.hasGetter("gmtModified")) {
                setFieldValByName("gmtCreate", new Date(), metaObject);
                setFieldValByName("gmtModified", new Date(), metaObject);
            }
        }
    
        /**
         * 最后一次更新时间
         */
        @Override
        public void updateFill(MetaObject metaObject) {
            LOG.info(" -------------------- start update fill ...  --------------------");
            if (metaObject.hasGetter("et.gmtModified")) {
                setFieldValByName("gmtModified", new Date(), metaObject);
            }
        }

    mybatis-plus以前的填充策略是:

    public enum FieldFill {
        DEFAULT(0, "默认不处理"),
        INSERT(1, "插入填充字段"),
        UPDATE(2, "更新填充字段"),
        INSERT_UPDATE(3, "插入和更新填充字段");
        /**
         * 主键
         */
        private final int key;
        /**
         * 描述
         */
        private final String desc;
        FieldFill(final int key, final String desc) {
            this.key = key;
            this.desc = desc;
        }
        public static FieldFill getIgnore(int key) {
            FieldFill[] fis = FieldFill.values();
            for (FieldFill fi : fis) {
                if (fi.getKey() == key) {
                    return fi;
                }
            }
            return FieldFill.DEFAULT;
        }
        public int getKey() {
            return this.key;
        }
        public String getDesc() {
            return this.desc;
        }
    }

    现在只能看到枚举类型。

  • 相关阅读:
    bzoj 1195: [HNOI2006]最短母串 爆搜
    bzoj 4066: 简单题 kd-tree
    NOI冲刺计划2
    bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
    bzoj 3153: Sone1 Toptree
    CTSC && APIO 总结
    bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp
    bzoj 1902: Zju2116 Christopher lucas定理 && 数位DP
    BZOJ 1754: [Usaco2005 qua]Bull Math
    BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/13976151.html
Copyright © 2011-2022 走看看