成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

公共字段自動填充的六種神技,開發(fā)效率翻倍!

開發(fā) 前端
本文將分享一套經(jīng)過生產(chǎn)驗證的自動化方案,涵蓋MyBatis-Plus、AOP、JWT等六種核心策略,助你徹底擺脫公共字段維護的煩惱。

在開發(fā)外賣系統(tǒng)訂單模塊時,我發(fā)現(xiàn)每個實體類都包含create_time、update_by等重復字段。手動維護這些字段不僅效率低下,還容易出錯。

本文將分享一套經(jīng)過生產(chǎn)驗證的自動化方案,涵蓋MyBatis-Plus、AOP、JWT等六種核心策略,助你徹底擺脫公共字段維護的煩惱。

一、痛點分析:公共字段維護的三大困境

1.1 典型問題場景
// 訂單創(chuàng)建邏輯
publicvoidcreateOrder(OrderDTO dto){
    Order order = convertToEntity(dto);
    
    // 手動設(shè)置公共字段
    order.setCreateTime(LocalDateTime.now());
    order.setUpdateTime(LocalDateTime.now());
    order.setCreateUser(getCurrentUser());
    order.setUpdateUser(getCurrentUser());
    
    orderMapper.insert(order);
}

// 訂單更新邏輯 
publicvoidupdateOrder(OrderDTO dto){
    Order order = convertToEntity(dto);
    
    // 重復設(shè)置邏輯
    order.setUpdateTime(LocalDateTime.now());
    order.setUpdateUser(getCurrentUser());
    
    orderMapper.updateById(order);
}

痛點總結(jié):

  • 代碼重復率高(每個Service方法都要設(shè)置)
  • 維護成本高(字段變更需修改多處)
  • 容易遺漏(特別是更新操作)

二、基礎(chǔ)方案: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 LocalDateTime updateTime;
    
    @TableField(fill = FieldFill.INSERT)
    private String createUser;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
}

// 訂單實體繼承基類
publicclassOrderextendsBaseEntity{
    // 業(yè)務(wù)字段...
}

三、進階方案:AOP統(tǒng)一處理

3.1 自定義注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public@interface AutoFill {
    OperationType value();
}

publicenum OperationType {
    INSERT,
    UPDATE
}
3.2 切面實現(xiàn)
@Aspect
@Component
@Slf4j
publicclassAutoFillAspect{
    
    @Autowired
    private ObjectMapper objectMapper;

    @Around("@annotation(autoFill)")
    public Object around(ProceedingJoinPoint pjp, AutoFill autoFill)throws Throwable {
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            if (arg instanceof BaseEntity) {
                fillFields((BaseEntity) arg, autoFill.value());
            }
        }
        return pjp.proceed(args);
    }

    privatevoidfillFields(BaseEntity entity, OperationType type){
        String currentUser = getCurrentUser();
        LocalDateTime now = LocalDateTime.now();
        
        if (type == OperationType.INSERT) {
            entity.setCreateTime(now);
            entity.setCreateUser(currentUser);
        }
        entity.setUpdateTime(now);
        entity.setUpdateUser(currentUser);
    }
    
    // 獲取當前用戶(支持多線程環(huán)境)
    private String getCurrentUser(){
        return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
                      .map(attrs -> (ServletRequestAttributes) attrs)
                      .map(ServletRequestAttributes::getRequest)
                      .map(req -> req.getHeader("X-User-Id"))
                      .orElse("system");
    }
}

四、生產(chǎn)環(huán)境最佳實踐

4.1 多數(shù)據(jù)源適配
@Configuration
publicclassDataSourceConfig{
    
    @Bean
    @ConfigurationProperties("spring.datasource.master")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    public MetaObjectHandler metaObjectHandler(){
        returnnew MultiDataSourceAutoFillHandler();
    }
}

publicclassMultiDataSourceAutoFillHandlerextendsMetaObjectHandler{
    // 根據(jù)當前數(shù)據(jù)源動態(tài)處理
}
4.2 分布式ID生成
publicclassSnowflakeIdGenerator{
    // 實現(xiàn)分布式ID生成
}

// 在自動填充中集成
@Override
publicvoidinsertFill(MetaObject metaObject){
    this.strictInsertFill(metaObject, "id", String.class, 
        idGenerator.nextId());
}

五、避坑指南:五大常見問題

5.1 空指針異常防護
// 使用Optional處理可能為空的情況
private String safeGetUser(){
    return Optional.ofNullable(SecurityContextHolder.getContext())
                 .map(SecurityContext::getAuthentication)
                 .map(Authentication::getPrincipal)
                 .map(principal -> {
                     if (principal instanceof UserDetails) {
                         return ((UserDetails) principal).getUsername();
                     }
                     return principal.toString();
                 })
                 .orElse("system");
}
5.2 字段覆蓋問題
// 在實體類中使用@TableField策略
@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NEVER)
private String createUser;

六、性能優(yōu)化方案

6.1 緩存當前用戶信息
publicclassUserContextHolder{
    privatestaticfinal ThreadLocal<String> userHolder = new ThreadLocal<>();
    
    publicstaticvoidsetUser(String user){
        userHolder.set(user);
    }
    
    publicstatic String getUser(){
        return userHolder.get();
    }
    
    publicstaticvoidclear(){
        userHolder.remove();
    }
}

// 在攔截器中設(shè)置
publicclassUserInterceptorimplementsHandlerInterceptor{
    @Override
    publicbooleanpreHandle(HttpServletRequest request, 
                            HttpServletResponse response, 
                            Object handler){
        UserContextHolder.setUser(request.getHeader("X-User-Id"));
        returntrue;
    }
}
6.2 批量操作優(yōu)化
@Transactional
publicvoidbatchInsert(List<Order> orders){
    // 提前獲取公共字段值
    String user = getCurrentUser();
    LocalDateTime now = LocalDateTime.now();
    
    orders.forEach(order -> {
        order.setCreateTime(now);
        order.setCreateUser(user);
        order.setUpdateTime(now);
        order.setUpdateUser(user);
    });
    
    orderMapper.batchInsert(orders);
}

七、監(jiān)控與審計

7.1 審計日志集成
@EntityListeners(AuditingEntityListener.class)
publicclassBaseEntity{
    @CreatedBy
    private String createUser;
    
    @LastModifiedBy
    private String updateUser;
    
    @CreatedDate
    private LocalDateTime createTime;
    
    @LastModifiedDate
    private LocalDateTime updateTime;
}
7.2 操作日志追蹤
@Aspect
@Component
publicclassOperationLogAspect{
    
    @AfterReturning("@annotation(autoFill)")
    publicvoidlogOperation(AutoFill autoFill){
        LogEntry log = new LogEntry();
        log.setOperator(getCurrentUser());
        log.setOperationType(autoFill.value().name());
        logService.save(log);
    }
}

結(jié)語: 通過本文的六種方案組合使用,我們在生產(chǎn)環(huán)境中實現(xiàn)了:

  • 公共字段維護代碼量減少90%
  • 相關(guān)Bug率下降75%
  • 新功能開發(fā)效率提升40%

最佳實踐清單:

  • 基礎(chǔ)字段使用MyBatis-Plus自動填充
  • 復雜場景結(jié)合AOP處理
  • 分布式環(huán)境集成唯一ID生成
  • 重要操作添加審計日志
  • 定期檢查字段填充策略

未來展望: 隨著Spring Data JPA的演進,未來可以探索與Reactive編程的結(jié)合,實現(xiàn)全鏈路的非阻塞式自動填充。

責任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2025-05-29 03:00:00

2025-06-05 01:00:00

2020-09-21 08:32:03

JavaSQL公共字段

2024-09-06 08:02:52

2023-07-04 08:19:25

IDEA插件

2023-12-06 18:21:12

編程語言AI開發(fā)AI

2016-01-15 17:36:29

云計算云應(yīng)用

2011-06-07 09:36:18

2012-10-15 13:26:31

云計算架構(gòu)

2025-02-27 00:00:30

SpringJava方式

2009-02-11 09:46:00

ASON網(wǎng)絡(luò)演進

2023-04-27 13:16:45

2022-06-01 23:30:04

漏洞網(wǎng)絡(luò)安全移動攻擊

2010-10-08 11:13:22

MySQL修改密碼

2022-03-23 12:55:50

農(nóng)業(yè)物聯(lián)網(wǎng)

2024-02-26 11:12:33

定時任務(wù)線程

2017-10-20 11:07:45

編程代碼編程模式

2024-01-05 13:25:00

架構(gòu)架構(gòu)模式開發(fā)

2022-10-25 12:09:13

2024-11-11 06:20:00

緩存開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩一区二区三区精品 | 91精品中文字幕一区二区三区 | 91精品国产综合久久国产大片 | 亚洲第一av| av片网站 | 国产在线资源 | 免费视频一区二区 | 91久久久久久久久 | 久久在线精品 | 亚洲精品久久久久久国产精华液 | 97国产在线观看 | 国产精品久久久久久久久久妇女 | 亚洲韩国精品 | 中文字幕在线观看第一页 | 蜜臀网 | 国产精品99999999| 久久亚洲一区 | 亚洲一区二区三区视频 | 亚洲xxxxx| 国产亚洲欧美日韩精品一区二区三区 | 日韩精品一二三区 | 日本一区二区三区四区 | 久久综合影院 | 91成人免费 | 少妇黄色 | 欧美xxxx做受欧美 | 99视频在线播放 | 祝你幸福电影在线观看 | 久久av网站| 国产精品一区二区久久久久 | 日韩免费激情视频 | 一区二区高清不卡 | 欧美一级一区 | 农村妇女毛片精品久久久 | 欧美日韩精品影院 | 色男人的天堂 | www.4hu影院 | 成人精品毛片国产亚洲av十九禁 | 91在线视频一区 | 国产成人久久精品 | 久久久一区二区 |