我是靠谱客的博主 威武饼干,最近开发中收集的这篇文章主要介绍Mybatis-plus 公共字段自动填充,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Mybatis-Plus官方文档:自动填充功能


1. 在实体类的属性上添加 @TableField 注解,指定自动填充的策略;

填充策略:

填充策略

/**
* 创建人
 */
@TableField(fill = FieldFill.INSERT)	// 插入时填充字段
private Long createUser;

/**
 * 修改人
 */
@TableField(fill = FieldFill.INSERT_UPDATE)		// 插入和修改时填充字段
private Long updateUser;

2. 按照框架要求编写 元数据对象处理器, 在此类中统一为公共字段赋值,此类需要实现 MetaObjectHandler 接口。

/**
 * 元数据对象处理器,实现 MetaObjectHandler接口
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入操作,自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 获得当前线程的 request,得到 session,获取session中的 employeeId。RequestAttributes.SCOPE_SESSION:获取范围为session。
        // 注意,由于线程问题,不能写在该方法外
        Long employeeId = (Long) RequestContextHolder
                .currentRequestAttributes()
                .getAttribute("employeeId", RequestAttributes.SCOPE_SESSION);
		//将当前时间赋值给“createTime”属性,这样当插入或修改数据时,createTime是有值的,而不是null
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
		//将“创建人”赋值给“createUser”属性,当执行插入操作时自动执行
        metaObject.setValue("createUser", employeeId);
		//当执行插入操作或更新操作时自动执行
        metaObject.setValue("updateUser", employeeId);
    }

    /**
     * 更新操作,自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 获得当前线程的 request,得到 session,获取session中的 employeeId。RequestAttributes.SCOPE_SESSION:获取范围为session。
        Long employeeId = (Long) RequestContextHolder
                .currentRequestAttributes()
                .getAttribute("employeeId", RequestAttributes.SCOPE_SESSION);

        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", employeeId);
    }
}

下面是官方文档的操作:

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        // 或者
        this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
        // 或者
        this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }
}

这样的话,当createUser执行插入操作 或 updateUser执行插入和更新操作时,会按照 MetaObjectHandler 中的处理方式进行自动填充。

最后

以上就是威武饼干为你收集整理的Mybatis-plus 公共字段自动填充的全部内容,希望文章能够帮你解决Mybatis-plus 公共字段自动填充所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部