当数据类型出现updateuser,createuser等通用字段字段发生更改的时候,我们一般在service层对通用数据进行填充,在MybatisPlus的功能中可以对指定字段进行填充
实体类表明字段
实体类
package com.example.ruiji.Entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 地址簿
*/
@Data
public class AddressBook implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
//用户id
private Long userId;
//收货人
private String consignee;
//手机号
private String phone;
//性别 0 女 1 男
private String sex;
//省级区划编号
private String provinceCode;
//省级名称
private String provinceName;
//市级区划编号
private String cityCode;
//市级名称
private String cityName;
//区级区划编号
private String districtCode;
//区级名称
private String districtName;
//详细地址
private String detail;
//标签
private String label;
//是否默认 0 否 1是
private Integer isDefault;
//创建时间
@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;
//是否删除
private Integer isDeleted;
}
mp中使用@TableField字段可以指定映射关系 同样也可以指定填充类型,
- insert 数据执行插入操作,该字段自动填充
- update 数据执行update操作时候,执行自动填充
- INSERT_UPDATE 插入和更新时候执行自动填充
2.创建数据填充类型
实现MetaObjectHandler 类型重写该方法
@Component //注入ioc
@Slf4j
public class MetaObjectHandler implements com.baomidou.mybatisplus.core.handlers.MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 对于标记的数据的地方进行 标注
// 当数据发生对应操作以后 进行自动填充
// 字段名,字段值
/**
* 但是问题出现了,不是handler没办法获取到请求头中携带的id
* 所以只能通过当线程来获取
*/
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
String id = UserHolder.getUser().get("id").toString();
if (id != null){
metaObject.setValue("createUser", Long.parseLong(id));
// 当前修改用户id insert 的时候也要初始化
metaObject.setValue("updateUser", Long.parseLong(id));
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("执行update自动填充");
metaObject.setValue("updateTime", LocalDateTime.now());
String id = UserHolder.getUser().get("id").toString();
if (id != null){
metaObject.setValue("updateUser", Long.parseLong(id));
}
}
}
metaObject.setValue(“createTime”, LocalDateTime.now());是一个kv形式,我登陆验证的时候将用户id储存到了本地线程
3 填充字段出现多个实体类重复字段名
@Override
public void insertFill(MetaObject metaObject) {
Object entity = metaObject.getOriginalObject();
String className = entity.getClass().getName(); // 获取当前实体类的类名字符串
if (className.equals("com.example.demo.entity.A")) { // 判断当前实体类是否为 A
setFieldValByName("createTime", new Date(), metaObject); // 对 A 的 createTime 字段进行自动填充
} else if (className.equals("com.example.demo.entity.B")) { // 判断当前实体类是否为 B
setFieldValByName("createTime", LocalDate.now(), metaObject); // 对 B 的 createTime 字段进行自动填充
}
}
*/
根数元数据判断当前实体类是什么,然后执行不同的填充策略