工作小总结&小工具类

消除重复代码:MyBatis-Plus自动填充公共字段实战

本文深入探讨了如何利用MyBatis-Plus、AOP等技术实现数据库表公共字段(如创建时间、更新用户)的自动化维护,显著减少代码重复率和维护成本。涵盖基础方案到高级实践,并提供性能优化与监控审计策略。

  1. 消除重复代码:MyBatis-Plus自动填充公共字段实战

大家好,我是凯哥Java

本文标签:自动填充、Java开发技巧、性能优化、公共字段填充

image.png



在日常的开发中,我们经常能碰见每个实体类都包含create_time、update_by等重复字段。手动维护这些字段不仅效率低下,还容易出错。本文将分享一套经过生产验证的自动化方案,涵盖MyBatis-Plus、AOP、JWT等六种核心策略,助你彻底摆脱公共字段维护的烦恼。


一、痛点分析:公共字段维护的三大困境

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

原创不易,完成人机校验,阅读全文

相关推荐