MyBatis-Puls插入或修改时某些字段自动填充操作示例
介绍
在开发中,某些字段需要在插入或修改时自动被填充进数据库,如创建者,修改者等。
MyBatis-Puls提供了 MetaObjectHandler 接口,通过重写其中的 insertFill 与 updateFill 方法,实现在 新增 or 修改 时 动态的拿到实体类,在向实体类中 set 数据完成每次 新增或修改时自动填充数据 如 创建者、修改者这种数据在实体类上加注解 @TableField(fill = FieldFill.XXXXXX) 选择进入insert时填充还是update时填充,还是都填充
样例
Handler实现类
/**
* MP注入处理器
*
* @author
* @date 2021/4/25
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();//获得当前要进行sql操作的实体类
Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime())
? baseEntity.getCreateTime() : new Date();
baseEntity.setCreateTime(current);
baseEntity.setUpdateTime(current);
String username = StringUtils.isNotBlank(baseEntity.getCreateBy())
? baseEntity.getCreateBy() : getLoginUsername();
// 当前已登录 且 创建人为空 则填充
baseEntity.setCreateBy(username);
// 当前已登录 且 更新人为空 则填充
baseEntity.setUpdateBy(username);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();//获得当前要进行sql操作的实体类
Date current = new Date();
// 更新时间填充(不管为不为空)
baseEntity.setUpdateTime(current);
String username = getLoginUsername();
// 当前已登录 更新人填充(不管为不为空)
if (StringUtils.isNotBlank(username)) {
baseEntity.setUpdateBy(username);
}
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
/**
* 获取登录用户名
*/
private String getLoginUsername() {
LoginUser loginUser;
try {
loginUser = LoginHelper.getLoginUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return ObjectUtil.isNotNull(loginUser) ? loginUser.getUsername() : null;
}
}实体类
/**
* Entity基类
*
* @author
*/
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 搜索值
*/
@JsonIgnore
@TableField(exist = false)
private String searchValue;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT) //创建时自动填充
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE) //创建 or 修改时自动填充
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
}以上就是MyBatis-Puls插入或修改时某些字段自动填充操作示例的详细内容,更多关于MyBatis Puls插入修改自动填充的资料请关注脚本之家其它相关文章!
相关文章
如何使用IDEA的groovy脚本文件生成带JPA注解的实体类(图文详解)
这篇文章主要介绍了如何使用IDEA的groovy脚本文件生成带JPA注解的实体类,本文通过图文并茂实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07
浅析IDEA如何正确配置Gradle? GRADLE_USER_HOME 和 Gradle user home的区别
这篇文章主要介绍了IDEA如何正确配置Gradle? GRADLE_USER_HOME 和 Gradle user home的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-08-08
Spring Boot 如何通过ServletRequestHandledEvent事件实现接口请求的性能监控
在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现,这篇文章给大家介绍Spring Boot 如何通过ServletRequestHandledEvent事件实现接口请求的性能监控,感兴趣的朋友跟随小编一起看看吧2024-08-08
MyBatis-Plus 中 typeHandler 的使用实例详解
本文介绍了在MyBatis-Plus中如何使用typeHandler处理json格式字段和自定义typeHandler,通过使用JacksonTypeHandler,可以简单实现将实体类字段转换为json格式存储,感兴趣的朋友跟随小编一起看看吧2024-10-10


最新评论