1. 实现监听处理类
创建一个自己的CreateAndUpdateEntityHandler
:一个实现MP中MetaObjectHandler
接口的类,并且重载insertFill
和updateFill
方法,并在这两个方法中编写插入和更新操作时填充的字段和逻辑。
package com.gangbb.core.config.mybatisplus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.gangbb.common.exception.ApiException;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @Author Gangbb
* @Description MP 自动填充处理器
* @Date 2021/7/22
**/
@Component
public class CreateAndUpdateEntityHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
//根据属性名字设置要填充的值
if (metaObject.hasGetter("createTime")) {
if (metaObject.getValue("createTime") == null) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
}
if (metaObject.hasGetter("creator")) {
if (metaObject.getValue("creator") == null) {
this.setFieldValByName("creator", SecurityUtils.getUsername(), metaObject);
}
}
} catch (Exception e) {
throw new ApiException("A0008-1", e.getMessage());
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (metaObject.hasGetter("reviser")) {
if (metaObject.getValue("reviser") == null) {
this.setFieldValByName("reviser", SecurityUtils.getUsername(), metaObject);
}
}
if (metaObject.hasGetter("updateTime")) {
if (metaObject.getValue("updateTime") == null) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
} catch (Exception e) {
throw new ApiException("A0008-2", e.getMessage());
}
}
}
对应的实体类要加上@TableField
注解:
更新填充参数:@TableField(fill = FieldFill.UPDATE)
新增填充参数:@TableField(fill = FieldFill.INSERT)
注意如果这里不使用
@Component
注解声明,可以在Mybatis-Plus的配置文件MybatisPlusConfig
中声明:@Bean public MetaObjectHandler metaObjectHandler() { return new CreateAndUpdateMetaObjectHandler(); }
2. 在相应字段上加@TableField注解
我这里是在实体类基类中的字段加上!
package com.gangbb.core.model.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.io.Serializable;
import java.util.Date;
/**
* @author : Gangbb
* @Description : 数据库实体类--Entity基类
* @Date : 2021/3/7
*/
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/** 主键id */
private Long id;
/** 创建者 */
private String creator;
/** 创建时间 */
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/** 更新者 */
private String reviser;
/** 更新时间 */
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/** 是否删除 0-未删除 1-已删除 */
@TableField(fill = FieldFill.INSERT)
private Integer delFlag;
/** 备注 */
private String remark;
// get/set方法省略
}
3. 存在bug
1. 使用boolean update(Wrapper updateWrapper),自动填充会失效
主要原因:底层实现自动填充时,需要获取到实例对象对应的表结构信息,使用update(wrapper xxx)方法时,表结构信息为空,所以直接跳过了填充逻辑。