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插入修改自动填充的资料请关注脚本之家其它相关文章!
相关文章
Spring Boot整合elasticsearch的详细步骤
这篇文章主要介绍了Spring Boot整合elasticsearch的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04Java8通过Function获取字段名的方法(获取实体类的字段名称)
Java8通过Function获取字段名。不用再硬编码,效果类似于mybatis-plus的LambdaQueryWrapper,对Java8通过Function获取字段名相关知识感兴趣的朋友一起看看吧2021-09-09SpringBoot中SmartLifecycle的使用解析
这篇文章主要介绍了SpringBoot中SmartLifecycle的使用解析,SmartLifecycle是一个扩展了Lifecycle接口,可以跟踪spring容器ApplicationContext刷新或者关闭的接口,实现该接口的实现类有特定的执行顺序,需要的朋友可以参考下2023-11-11
最新评论