注意: 我们可以看到数据库新增后,后面几个字段是没有的(创建时间、修改时间、创建人、修改人等),如果我们手动进行set操作那么效率极低,而MybatisPlus为我们添加了相关拦截器操作!
说明: MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值(实现这个需求的方法不止一种,在SQL层面也可以做到,在建表的时候也可以指定默认值,但都不够如此灵活)
创建自定义MetaObjectHandler类
注意: 因为上面@ComponentScan(value = "com.ssm")注解的关系,所以要将我们的自定义的Handler给放入com.ssm包下!
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; //乐观锁
}