1.配置自定义的元数据对象处理器
package com.example.common.conf.mybatis;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.example.common.utils.JwtTokenUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
@Component
@Slf4j
public class MyMetaObjectHandle implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充 [insert]...");
String token = getRequestToken();
Claims claims = JwtTokenUtils.analysisToken(token);
String userId = claims.getId();
metaObject.setValue("createTime", new Date());
metaObject.setValue("updateTime", new Date());
metaObject.setValue("createBy", Integer.parseInt(userId));
metaObject.setValue("updateBy", Integer.parseInt(userId));
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充 [update]...");
String token = getRequestToken();
Claims claims = JwtTokenUtils.analysisToken(token);
String userId = claims.getId();
metaObject.setValue("updateTime", new Date());
metaObject.setValue("updateBy", Integer.parseInt(userId));
}
private String getRequestToken() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
return request.getHeader("token");
}
return null;
}
}
2.创建User对象来测试处理效果
(1)提取User对象中公共字段封装成BaseEntity,公共类BaseEntity的字段使用注解@TableField
@TableField(fill = FieldFill.INSERT)该注解会在添加数据时自动填充
@TableField(fill = FieldFill.INSERT_UPDATE)该注解会在添加数据或更新数据时自动填充
@TebleField(fill = FieldFill.UPDATE)该注解会在更新数据时自动填充
package com.example.springbootdemo.common.utils;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
private String createBy;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ApiModelProperty(value = "备注")
private String remark;
}
(2)使User类继承BaseEntity类使用其自动填充功能
package com.example.springbootdemo.model;
import com.baomidou.mybatisplus.annotation.*;
import com.example.springbootdemo.common.utils.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@TableName("user")
@ApiModel(description = "用户类")
public class User extends BaseEntity {
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "用户ID")
private Integer id;
@ApiModelProperty(value = "用户姓名")
private String name;
@ApiModelProperty(value = "用户账号")
private String account;
@ApiModelProperty(value = "用户密码")
private String password;
}