1、创建时间和更新时间在数据库表层面就可以解决
`create_time` datetime DEFAULT NULL CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
2、创建人和更新人赋值操作
MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。
使用场景:公共字段填充等,如updateTime、createTime、createUser、updateUser等公共字段多的填充。
@Data
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
@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;
}
2、自定义元对象处理器类,实现metaObjecthandler接口,重写insertFill、updateFill方法;
1)在每次执行插入和修改操作时,会执行insertFill,updateFill方法;
2)setValue(String name,Object value) : 设置公共字段填充值,第一个参数值name与实体字段要相同
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.chinaunicom.common.core.domain.BaseEntity;
import com.chinaunicom.common.exception.ServiceException;
import com.chinaunicom.common.utils.SecurityUtils;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* MyBatis Plus 元对象处理器配置(插入或修改时自动填充)
*
* @author Charles7c
* @since 2022/12/22 19:52
*/
public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {
/** 创建人 */
private static final String CREATE_USER = "createBy";
/** 创建时间 */
private static final String CREATE_TIME = "createTime";
/** 修改人 */
private static final String UPDATE_USER = "updateBy";
/** 修改时间 */
private static final String UPDATE_TIME = "updateTime";
/**
* 插入数据时填充
*
* @param metaObject
* 元对象
*/
@Override
public void insertFill(MetaObject metaObject) {
try {
if (null == metaObject) {
return;
}
String createUser = SecurityUtils.getUsername();
Date createTime = new Date();
if (metaObject.getOriginalObject() instanceof BaseEntity) {
// 继承了 BaseDO 的类,填充创建信息
BaseEntity baseDO = (BaseEntity)metaObject.getOriginalObject();
baseDO.setCreateBy(ObjectUtil.defaultIfNull(baseDO.getCreateBy(), createUser));
baseDO.setCreateTime(ObjectUtil.defaultIfNull(baseDO.getCreateTime(), createTime));
} else {
// 未继承 BaseDO 的类,如存在创建信息则进行填充
this.fillFieldValue(metaObject, CREATE_USER, createUser, false);
this.fillFieldValue(metaObject, CREATE_TIME, createTime, false);
}
} catch (Exception e) {
throw new ServiceException("插入数据时自动填充异常:" + e.getMessage());
}
}
/**
* 修改数据时填充
*
* @param metaObject
* 元对象
*/
@Override
public void updateFill(MetaObject metaObject) {
try {
if (null == metaObject) {
return;
}
String updateUser = SecurityUtils.getLoginUser().getUsername();
Date updateTime = new Date();
if (metaObject.getOriginalObject() instanceof BaseEntity) {
// 继承了 BaseDO 的类,填充修改信息
BaseEntity baseDO = (BaseEntity)metaObject.getOriginalObject();
baseDO.setUpdateBy(updateUser);
baseDO.setUpdateTime(updateTime);
} else {
// 未继承 BaseDO 的类,根据类中拥有的修改信息进行填充,不存在修改信息不进行填充
this.fillFieldValue(metaObject, UPDATE_USER, updateUser, true);
this.fillFieldValue(metaObject, UPDATE_TIME, updateTime, true);
}
} catch (Exception e) {
throw new ServiceException("修改数据时自动填充异常:" + e.getMessage());
}
}
/**
* 填充字段值
*
* @param metaObject
* 元数据对象
* @param fieldName
* 要填充的字段名
* @param fillFieldValue
* 要填充的字段值
* @param isOverride
* 如果字段值不为空,是否覆盖(true 覆盖、false 不覆盖)
*/
private void fillFieldValue(MetaObject metaObject, String fieldName, Object fillFieldValue, boolean isOverride) {
if (metaObject.hasSetter(fieldName)) {
Object fieldValue = metaObject.getValue(fieldName);
setFieldValByName(fieldName, null != fieldValue && !isOverride ? fieldValue : fillFieldValue, metaObject);
}
}
}