SpringBoot 公共字段自动填充的6种神技,开发效率飙升!

一、痛点分析:公共字段维护的三大困境
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);}AI生成项目go运行

痛点总结:

  • 代码重复率高(每个Service方法都要设置)
  • 维护成本高(字段变更需修改多处)
  • 容易遗漏(特别是更新操作)
二、基础方案:MyBatis-Plus自动填充
2.1 配置元对象处理器
@Slf4j@ComponentpublicclassAutoFillHandlerimplementsMetaObjectHandler{        // 插入时自动填充    @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");    }}AI生成项目go运行