MybatisPlus自动填充策略

409 阅读1分钟

描述

在规范的数据库表中,每个表结构都具有共同的字段,比如:新建ID、新建名称、新建时间、修改ID、修改名称、修改时间等字段。在mybatis-plus中实现有填充策略,其作用就是自动帮助将参数封装到实体中,在保存或者修改数据时,自动映射到实体字段,最终写入到数据库中。

公共实体类

/**
 * 基础实体,提供pojo继承的父类Bean
 *
 * @author: 苦瓜不苦
 * @date: 2022/1/4 20:34
 */
@Data
public class ParentModel implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 修改时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 修改ID
     */
    @TableField(value = "update_id", fill = FieldFill.INSERT_UPDATE)
    private Long updateId;

    /**
     * 修改名称
     */
    @TableField(value = "update_name", fill = FieldFill.INSERT_UPDATE)
    private String updateName;

    /**
     * 新建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 新建ID
     */
    @TableField(value = "create_id", fill = FieldFill.INSERT)
    private Long createId;

    /**
     * 新建名称
     */
    @TableField(value = "create_name", fill = FieldFill.INSERT)
    private String createName;


}

实现MetaObjectHandler接口

/**
 * 自动填充策略
 *
 * @author: 苦瓜不苦
 * @date: 2022/1/5 20:17
 **/
@Configuration
public class MetaObjectHandlerConfig implements MetaObjectHandler {

    private static final String create_id = "createId";
    private static final String create_name = "createName";
    private static final String create_time = "createTime";
    private static final String update_id = "updateId";
    private static final String update_name = "updateName";
    private static final String update_time = "updateTime";


    /**
     * 新增填充策略
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        insertAndUpdate(metaObject, Arrays.asList(create_id, create_name, create_time, update_id, update_name, update_time));
    }

    /**
     * 修改填充策略
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        insertAndUpdate(metaObject, Arrays.asList(update_id, update_name, update_time));
    }


    private void insertAndUpdate(MetaObject metaObject, List<String> fillNameList) {
        // 从隔离线程中获取用户信息
        UserInfo userInfo = UserInfoUtil.get();
        if (ObjectUtil.isNull(userInfo)) {
            userInfo = new UserInfo();
        }
        for (String name : fillNameList) {
            Object object = null;
            switch (name) {
                case create_id:
                case update_id:
                    object = userInfo.getId();
                    break;
                case create_name:
                case update_name:
                    object = userInfo.getUsername();
                    break;
                case create_time:
                case update_time:
                    object = LocalDateTime.now();
                    break;
                default:
                    break;

            }
            // 判断是否存在该字段
            boolean bool = metaObject.hasSetter(name);
            if (bool) {
                // 判断字段是否为null
                Object value = getFieldValByName(name, metaObject);
                if (value == null) {
                    setFieldValByName(name, object, metaObject);
                }
            }

        }

    }
}