• 【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;
        }
    }

    现在只能看到枚举类型。

  • 相关阅读:
    帮你拿下 Java 面试题!
    JavaGUI编程的宿世此生
    从事Java开发可以往那些方面发展
    java初学者都要掌握的案例
    两数之和(java)
    2020年java就业前景
    300 行代码带你秒懂 Java 多线程!
    安卓程序员如何快速入门后端开发常识
    连夜整理的Java开源项目,有后台管理类、商城类、秒杀类、支付类
    Java面试题及答案,2020年最新面试题集合
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/13976151.html
Copyright © 2020-2023  润新知