mybatisPlus之自动填充工具MetaObjectHandler的简单使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


使用步骤

1.给实体类需要自动填充的字段添加注解

代码如下(示例):
注解中的fill属性表示字段填充标记,配合自动填充使用。
fill对应的值:
DEFAULT :默认不处理
INSERT : 插入操作时进行填充字段
UPDATE :更新操作时填充字段
INSERT_UPDATE :插入和更新操作时填充字段

@TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;   

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;  

2.自定义实现类实现MetaObjectHandler接口

代码如下(示例):
当需要执行新增或者修改操作的时候,业务层对实体类属性赋值,但是,createTime、updateTime、createUser、updateUser这四个属性除外,因为它们统一由当前类的metaObject对象进行赋值,值的来源根据实际情况而定,比如createTime和updateTime获取的当前系统时间。

BaseContext是基于Threadlocal自定义的工具类,用来获取当前登录对象id

@Component   //需要将当前类交给spring容器保管
public class MyMetaObjecthandler implements MetaObjectHandler {
    /**
     * 插入操作,自动填充。所有执行insert语句的时候执行该方法
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("metaObject-insert = " + metaObject);
        metaObject.setValue("createTime", LocalDateTime.now());  // 添加用户时间
        metaObject.setValue("updateTime", LocalDateTime.now());  // 修改用户时间
        metaObject.setValue("createUser", BaseContext.getCurrentId());    // 添加人的id
        metaObject.setValue("updateUser", BaseContext.getCurrentId());    // 更新人的id
    }


    /**
     * 更新操作,自动填充。所有执行update语句的时候执行该方法
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        System.out.println("metaObject-update = " + metaObject);

        long id = Thread.currentThread().getId();
        log.info("线程id = " + id);

        metaObject.setValue("updateTime", LocalDateTime.now());  // 修改用户时间
        metaObject.setValue("updateUser", BaseContext.getCurrentId());    // 更新人的id
    }

3.BaseContext工具类

代码如下(示例):
ThreadLocal:在同一个线程中开辟一块作用域空间存放数据。且作用域仅在同一个线程中,与别的线程具有隔离性。

此处setCurrentId可以理解为,创建了一个id的变量并且赋值。 getCurrentId可以理解为,获取id的值。

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<Long>();
    /**
     *  添加Id值
     * @param id
     */
    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    /**
     *   获取Id值
     * @return
     */
    public static Long getCurrentId() {
        return threadLocal.get();
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值