mybatis属性自动填充MetaObjectHandler

233 阅读2分钟

注意: 我们可以看到数据库新增后,后面几个字段是没有的(创建时间、修改时间、创建人、修改人等),如果我们手动进行set操作那么效率极低,而MybatisPlus为我们添加了相关拦截器操作!

说明: MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值(实现这个需求的方法不止一种,在SQL层面也可以做到,在建表的时候也可以指定默认值,但都不够如此灵活)

创建自定义MetaObjectHandler类

注意: 因为上面@ComponentScan(value = "com.ssm")注解的关系,所以要将我们的自定义的Handler给放入com.ssm包下!

image.png

Mybatis中的MetaObjectHandler是一个接口,用于为实体对象的属性自动赋值。它有以下几个方法:

  • insertFill(MetaObject metaObject):在执行插入操作时自动填充实体对象的属性值。

  • updateFill(MetaObject metaObject):在执行更新操作时自动填充实体对象的属性值。

package com.ssm.handle;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandle implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createBy", String.class, "ssm");
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "deleteFlag", Integer.class, 0);
        this.strictInsertFill(metaObject, "version", Integer.class, 0);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateBy", String.class, "ssm");
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

修改公共字段类

参数说明: 实体类的属性上加入 @TableField 注解

  • @TableField(fill = FieldFill.INSERT) :插入操作的时候填充
  • @TableField(fill = FieldFill.UPDATE) :更新操作的时候填充
package com.ssm.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
@Data
public class BaseEntity implements Serializable { //实现序列化接口(把对象转换为字节序列的过程称为对象的序列化)
    //当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。

    @TableField(fill = FieldFill.INSERT)
    private String createBy; //记录新增操作

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

    @TableField(fill = FieldFill.UPDATE)
    private String updateBy; //记录更新操作

    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    @TableLogic //指定逻辑删除字段(需配合yml文件配置使用)
    private Integer deleteFlag; //逻辑删除

    @TableField(fill = FieldFill.INSERT)
    private Integer version; //乐观锁
}