1.问题:
我们有一个菜品类dish,有一些属性比如创建时间,修改时间,创建人,修改人。而我们还有其他类比如订单,口味很多类都包含这样的属性,这些属性就是公共字段。
这些属性值设置的代码非常固定也很繁琐,每次增加或者修改的时候代码都是重复的,写起来非常麻烦。
@Data
public class Dish implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//菜品名称
private String name;
//菜品分类id
private Long categoryId;
//菜品价格
private BigDecimal price;
//公共字段
private LocalDateTime createTime;
private LocalDateTime updateTime;
private Long createUser;
private Long updateUser;
}
解决:
我们可以自定义一个元数据对象处理器类来填充这些公共字段,来提高开发效率。
实现mybatis plus里的MetaObjectHandler 接口,按照业务需求重写对应字段的方法。
*填充公共字段MetaObjectHandler
–insertFill指定给什么类型的操作填充字段
–metaObject.setValue(键,值)
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//公共字段填充[insert...]
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser", BaseContext.getCurrentId());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
//BaseContext.getCurrentId()是我自定义的类用来获取每个线程当前登录用户的id值
}
@Override
public void updateFill(MetaObject metaObject) {
//公共字段填充[update...]
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
}
实体类对应的公共字段属性要用注解标注才能实现自动填充
@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;