消除重复代码:MyBatis-Plus自动填充公共字段实战
消除重复代码:MyBatis-Plus自动填充公共字段实战
大家好,我是凯哥Java
本文标签:自动填充、Java开发技巧、性能优化、公共字段填充

一、痛点分析:公共字段维护的三大困境
1.1 典型问题场景
// 订单创建逻辑
publicvoidcreateOrder(OrderDTO dto){
Order order = convertToEntity(dto);
// 手动设置公共字段
order.setCreateTime(LocalDateTime.now());
order.setUpdateTime(LocalDateTime.now());
order.setCreateUser(getCurrentUser());
order.setUpdateUser(getCurrentUser());
orderMapper.insert(order);
}
// 订单更新逻辑
publicvoidupdateOrder(OrderDTO dto){
Order order = convertToEntity(dto);
// 重复设置逻辑
order.setUpdateTime(LocalDateTime.now());
order.setUpdateUser(getCurrentUser());
orderMapper.updateById(order);
}
痛点总结:
代码重复率高(每个Service方法都要设置)
维护成本高(字段变更需修改多处)
容易遗漏(特别是更新操作)
二、基础方案:MyBatis-Plus自动填充
2.1 配置元对象处理器
@Slf4j
@Component
publicclassAutoFillHandlerimplementsMetaObjectHandler{
// 插入时自动填充
@Override
publicvoidinsertFill(MetaObject metaObject){
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createUser", String.class, getCurrentUser());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateUser", String.class, getCurrentUser());
}
// 更新时自动填充
@Override
publicvoidupdateFill(MetaObject metaObject){
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateUser", String.class, getCurrentUser());
}
// 获取当前用户(从安全上下文)
private String getCurrentUser(){
return Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.map(Authentication::getName)
.orElse("system");
}
}
2.2 实体类注解配置
@Data
publicclassBaseEntity{
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalD
原创不易,完成人机校验,阅读全文