精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

徹底擺脫重復勞動:SpringBoot 實現公共字段自動填充的六種實用套路

開發 前端
本文將從實戰角度出發,介紹六種實用策略,通過 MyBatis-Plus、AOP、JWT 等手段,徹底解放你的雙手。

在開發外賣系統中的訂單模塊時,我意識到幾乎每個業務實體都需要包含如 create_timeupdate_user 等字段。而手動為這些字段賦值,無疑既耗時又容易遺漏細節,成為代碼維護中的一大隱患。本文將從實戰角度出發,介紹六種實用策略,通過 MyBatis-Plus、AOP、JWT 等手段,徹底解放你的雙手。

常規做法帶來的煩惱

在傳統的業務邏輯中,我們往往在每次插入或更新數據時手動設置時間戳和操作人:

public void createOrder(OrderDTO dto) {
    Order order = convertToEntity(dto);


    // 手動設置通用字段
    order.setCreateTime(LocalDateTime.now());
    order.setCreateUser(getCurrentUser());
    order.setUpdateTime(LocalDateTime.now());
    order.setUpdateUser(getCurrentUser());


    orderMapper.insert(order);
}

這種方式存在三個主要問題:

  • 代碼高度重復每個涉及新增/修改的 Service 方法都得重復寫一遍。
  • 維護困難一旦字段變化,牽涉面廣,容易遺漏。
  • 易出錯尤其在多人協作或業務復雜時,更容易出現空值或字段缺失的問題。

基礎解法:MyBatis-Plus 自動填充

開啟自動填充邏輯

通過實現 MetaObjectHandler 接口,我們可以集中管理插入與更新時的字段賦值:

@Slf4j
@Component
public class AutoFillHandler implements MetaObjectHandler {


    @Override
    public void insertFill(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
    public void updateFill(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");
    }
}

實體類配置字段填充策略

@Data
public class BaseEntity {
    @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;
}

進階玩法:基于 AOP 的注解式填充

為增強靈活性與可控性,我們可以自定義注解 + 切面方式實現字段填充。

定義注解和操作類型

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AutoFill {
    OperationType value();
}


public enum OperationType {
    INSERT,
    UPDATE
}

切面邏輯處理

@Aspect
@Component
@Slf4j
public class AutoFillAspect {


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


    private void fill(BaseEntity entity, OperationType type) {
        LocalDateTime now = LocalDateTime.now();
        String user = getCurrentUser();
        if (type == OperationType.INSERT) {
            entity.setCreateTime(now);
            entity.setCreateUser(user);
        }
        entity.setUpdateTime(now);
        entity.setUpdateUser(user);
    }


    private String getCurrentUser() {
        return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
                .map(attrs -> ((ServletRequestAttributes) attrs).getRequest())
                .map(req -> req.getHeader("X-User-Id"))
                .orElse("system");
    }
}

應對復雜環境的優化策略

多數據源兼容性配置

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MultiDataSourceAutoFillHandler();
    }
}

分布式唯一 ID 支持

public class SnowflakeIdGenerator {
    public String nextId() {
        // 實現略
        return UUID.randomUUID().toString();
    }
}

實戰避坑錦囊

防止空指針異常

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");
}

防止字段被覆蓋

@TableField(fill = FieldFill.INSERT, updateStrategy = FieldStrategy.NEVER)
private String createUser;

性能與可維護性提升

使用 ThreadLocal 緩存當前用戶信息

public class UserContextHolder {
    private static final ThreadLocal<String> userHolder = new ThreadLocal<>();


    public static void setUser(String user) {
        userHolder.set(user);
    }


    public static String getUser() {
        return userHolder.get();
    }


    public static void clear() {
        userHolder.remove();
    }
}

結合攔截器:

public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        UserContextHolder.setUser(request.getHeader("X-User-Id"));
        return true;
    }
}

批量操作優化

@Transactional
public void batchInsert(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);
}

操作審計與日志記錄

使用 JPA 審計功能

@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
    @CreatedBy
    private String createUser;


    @LastModifiedBy
    private String updateUser;


    @CreatedDate
    private LocalDateTime createTime;


    @LastModifiedDate
    private LocalDateTime updateTime;
}

操作日志記錄

@Aspect
@Component
public class OperationLogAspect {
    @AfterReturning("@annotation(autoFill)")
    public void logOperation(AutoFill autoFill) {
        LogEntry log = new LogEntry();
        log.setOperator(getCurrentUser());
        log.setOperationType(autoFill.value().name());
        logService.save(log);
    }
}

總結

通過以上六種策略的有機組合,我們在實際項目中實現了:

  • 公共字段維護代碼量降低 90%
  • 錯誤率下降 75%
  • 新功能交付效率提升 40%

實踐建議清單:

場景

推薦方案

常規字段填充

MyBatis-Plus 自動化處理

插入/更新邏輯

使用 AOP 注解進行統一處理

分布式部署

接入雪花算法生成全局 ID

安全與可控性

配合攔截器與 ThreadLocal 管理用戶上下文

審計日志

集成操作日志與 JPA 審計模塊


責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-05-27 01:44:00

2023-04-27 07:57:52

AutoIt自動化工具

2025-06-05 01:00:00

2019-07-02 09:30:31

程序員勞動陷阱

2025-05-15 07:15:00

AI智能勞動力GenAI

2025-08-04 06:20:00

自動化腳本Linux運維

2015-10-12 17:17:50

用戶體驗設計錯誤

2010-10-22 16:29:11

SQL Server刪

2022-05-25 09:55:40

數據重復提交Java

2024-11-20 15:24:49

2024-02-26 11:12:33

定時任務線程

2024-01-22 08:53:00

策略任務RocketMQ

2022-05-24 10:43:02

延時消息分布式MQ

2023-08-29 13:53:00

前端攔截HashMap

2023-05-10 13:58:13

服務限流系統

2022-02-01 15:44:33

Windows 10藍屏死機

2011-09-13 15:51:54

刪除數據庫重復行

2020-09-21 08:32:03

JavaSQL公共字段

2025-01-21 10:04:40

Java并發阻塞隊列

2017-06-26 10:35:58

前端JavaScript繼承方式
點贊
收藏

51CTO技術棧公眾號

青草视频在线免费直播 | 成人av在线看| 欧美激情免费看| 中国一级特黄录像播放| 日韩成人亚洲| 一区二区成人在线| 免费在线成人av| 一区不卡在线观看| 极品尤物久久久av免费看| 亚洲跨种族黑人xxx| 九九热精品在线播放| 女同视频在线观看| 国产欧美一区二区精品婷婷| 91色p视频在线| 日韩视频在线观看一区| av亚洲免费| 精品伦理精品一区| 中国黄色片一级| 日本在线播放一二三区| 亚洲欧洲精品天堂一级| 快播亚洲色图| 精品人妻少妇嫩草av无码专区| 国产精品免费看| 欧美成人中文字幕在线| b站大片免费直播| 99久久香蕉| 欧美男生操女生| 午夜精品久久久内射近拍高清| av中文字幕在线播放| 久久九九国产精品| 国产欧美一区二区三区另类精品 | 国产黄色三级网站| 电影91久久久| 欧美在线视频日韩| 99999精品视频| 伊人福利在线| 亚洲三级在线观看| 亚洲美女搞黄| 欧美色18zzzzxxxxx| 丁香啪啪综合成人亚洲小说| 成人国产精品久久久| 日本妇乱大交xxxxx| 99精品热6080yy久久| 欧美夫妻性生活视频| 午夜成人亚洲理伦片在线观看| 婷婷综合电影| 日韩成人在线免费观看| 蜜桃视频无码区在线观看| 日韩伦理一区二区| 欧美日韩国产一区| 男人添女人下面免费视频| 欧美va在线观看| 色婷婷一区二区三区四区| 97国产精东麻豆人妻电影| 欧美1234区| 亚洲伊人伊色伊影伊综合网| 黄色一级片国产| 色网在线观看| 亚洲一区二区在线播放相泽 | 激情一区二区| 色综合久久88| 国产一级免费av| 黄色欧美日韩| 欧美一二三视频| 欧产日产国产69| 另类亚洲自拍| 国产精品国语对白| 91av久久久| 国产一区二区女| 成人av免费在线看| 日批视频免费播放| 久久这里只精品最新地址| 欧美日韩亚洲免费| 在线免费观看黄色| 亚洲欧美一区二区三区久本道91| 欧美三级午夜理伦三级老人| 手机电影在线观看| 福利二区91精品bt7086| 国产一区视频免费观看| 色8久久久久| 日韩一卡二卡三卡四卡| 无码成人精品区在线观看| 日韩精品丝袜美腿| 一区二区三区美女xx视频| 亚洲欧美另类日本| 欧美成人亚洲| 日本精品中文字幕| 97免费观看视频| 成年人国产精品| 欧美三级电影在线播放| 日本www在线观看视频| 亚洲综合一区二区精品导航| 欧美a在线视频| 美女视频一区| 亚洲精品黄网在线观看| 人人妻人人澡人人爽| 欧美另类专区| 秋霞午夜一区二区| 国产毛片毛片毛片毛片| 99久久久无码国产精品| 神马影院午夜我不卡影院| а√中文在线8| 欧美午夜宅男影院在线观看| 手机av在线免费| 久久365资源| 中文字幕在线国产精品| 久久这里只有精品国产| 免费人成在线不卡| 国产精品一区而去| 日本在线观看免费| 一本久久精品一区二区| 国产精品中文久久久久久| 少妇精品导航| 欧美俄罗斯乱妇| 中文字幕免费高清在线观看| av网站一区二区三区| 中文字幕中文字幕在线中一区高清 | 国产一区二区三区免费看| 久精品国产欧美| 五月花成人网| 欧美日韩情趣电影| 在线免费观看黄色小视频| 欧美va天堂在线| 国产精品视频男人的天堂| 凸凹人妻人人澡人人添| 亚洲另类春色国产| 亚洲一区二区三区观看| 色棕色天天综合网| 91超碰中文字幕久久精品| 国产区精品在线| 1区2区3区国产精品| 成人免费观看毛片| 农村少妇一区二区三区四区五区| 欧美成在线观看| 97在线视频人妻无码| 日本一区二区视频在线| 精品国产乱码久久久久久影片| 亚洲日韩中文字幕在线播放| 欧美在线视频第一页| 丝袜美腿高跟呻吟高潮一区| 国产精品久久久久久久久婷婷| 欧美精品日韩少妇| 欧美优质美女网站| 色噜噜日韩精品欧美一区二区| 国产精品videosex极品| 成人免费直播live| 午夜毛片在线| 欧美日韩国产一二三| 日本一级免费视频| 久久亚洲电影| 欧美日韩在线观看一区| 亚洲第一av| 亚洲欧美另类人妖| 精品免费囯产一区二区三区| www.99精品| 久在线观看视频| 日韩成人av在线资源| 国语自产精品视频在线看抢先版图片| 成人av无码一区二区三区| 樱桃视频在线观看一区| 久久久久亚洲av无码网站| 欧美va天堂| 国产成人一区二区三区免费看| 黄视频在线免费看| 精品成a人在线观看| 日韩少妇高潮抽搐| 2020日本不卡一区二区视频| 国产成人精品视频免费看| 精品在线观看入口| 国产美女被下药99| 国产美女在线观看| 精品久久一区二区| 五月婷婷开心网| 国产丝袜美腿一区二区三区| the porn av| 欧美在线不卡| 国产主播一区二区三区四区| 色黄视频在线观看| 欲色天天网综合久久| 国产又大又黄又爽| 亚洲午夜国产一区99re久久| 欧美 日本 国产| 美腿丝袜一区二区三区| 国产911在线观看| 黄色成人美女网站| 国产精品免费在线免费| а天堂中文在线官网| 亚洲精品乱码久久久久久金桔影视| 黄色片免费观看视频| 国产精品嫩草99a| wwwxxxx在线观看| 久久久久看片| 久久久国内精品| 国产午夜一区| 91原创国产| 欧美www.| 欧美俄罗斯性视频| jizz亚洲| 精品国产乱码久久久久久蜜臀| 日本熟女毛茸茸| 亚洲精品国产视频| 无码少妇精品一区二区免费动态| 国产一区二区视频在线| 日本久久久精品视频| 久久久久久美女精品| 久久精品美女| 精品成人18| 国产成人精品久久久| 性xxxxfjsxxxxx欧美| 国产亚洲欧美日韩精品| 可以免费观看的毛片| 欧美精三区欧美精三区| 六月丁香在线视频| 亚洲激情在线激情| 免费看裸体网站| 337p粉嫩大胆噜噜噜噜噜91av | 久久狠狠婷婷| 女人床在线观看| 日韩理论电影院| 精品日本一区二区三区在线观看| 日本精品久久| 国产成人a亚洲精品| 欧美人动性xxxxz0oz| 日韩一区二区福利| 好男人免费精品视频| 亚洲第一网站男人都懂| 国产免费的av| 欧美日韩亚洲综合一区二区三区| 日韩成人免费在线视频| 樱花影视一区二区| 秋霞欧美一区二区三区视频免费| 久久久久久夜精品精品免费| 日本不卡视频一区| 国产九色精品成人porny | 国内成人精品2018免费看| 日韩av一二三四| 国产欧美一级| 久久精品国产sm调教网站演员| 91精品国产调教在线观看| 亚洲高清精品中出| 精品国产一区二区三区噜噜噜| 九9re精品视频在线观看re6 | 国产在线精品一区二区中文| 51亚洲精品| 成人欧美视频在线| 日本少妇精品亚洲第一区| 成人在线一区二区| 日日夜夜亚洲| 亚洲在线观看视频网站| 9999精品| 91在线中文字幕| 美女精品久久| 亚洲在线观看视频| 99这里只有精品视频| 国产v亚洲v天堂无码| 136导航精品福利| 国产富婆一区二区三区| 国产成人精品亚洲线观看| 国产精品免费一区二区| 国产91精品入| 欧美另类网站| 成人黄色小视频| 午夜老司机精品| 国产精品久久久久久影院8一贰佰| 亚洲在线欧美| 欧美影视一区| 精品无码一区二区三区在线| 国产日韩欧美在线播放不卡| 久久人妻精品白浆国产 | 欧美中文在线视频| 欧美精品总汇| 国产日韩欧美影视| 亚洲精品a区| 欧美日韩电影一区二区| 波多野结衣在线观看一区二区| 亚洲欧洲日韩精品| 午夜日韩av| 成人观看免费完整观看| 蜜桃视频在线一区| 精品人妻人人做人人爽夜夜爽| 成人国产精品免费观看动漫| 超碰97人人干| 国产精品视频观看| 国产福利久久久| 色综合久久久久综合| 97人妻人人澡人人爽人人精品 | 国产91精品对白在线播放| 婷婷久久伊人| 欧美日韩影院| 免费裸体美女网站| 国产一区999| 人妻少妇精品视频一区二区三区| 中文成人综合网| 久久久久成人网站| 欧美性欧美巨大黑白大战| 国产特级黄色片| 亚洲美女又黄又爽在线观看| 免费在线看a| 欧美亚洲成人免费| 麻豆精品在线| 亚洲7777| 日韩天天综合| 中文字幕中文在线| 26uuu另类欧美| xxxx日本少妇| 在线免费观看不卡av| 午夜精品在线播放| 中文字幕日韩av| 麻豆蜜桃在线观看| 96精品久久久久中文字幕| 私拍精品福利视频在线一区| 麻豆中文字幕在线观看| 久久午夜精品一区二区| 欧美做受高潮中文字幕| 最近日韩中文字幕| 免费视频网站在线观看入口| 精品乱人伦一区二区三区| 免费在线观看av| 国产91露脸中文字幕在线| 91国内精品| 国产在线拍揄自揄拍无码| 喷水一区二区三区| 久久精品一区二区免费播放| 一区二区三区欧美| 97人妻精品一区二区三区软件| 亚洲视频axxx| 在线人成日本视频| 国产精品一区二区三区观看| 在线成人激情| 一区二区免费av| 中文字幕乱码日本亚洲一区二区| 久久国产精品免费看| 精品剧情在线观看| 91最新在线视频| 亚洲最大成人在线| 亚洲成人最新网站| 做a视频在线观看| 国产精品久久影院| 中文字幕自拍偷拍| 伊人久久久久久久久久久| 欧美大片免费观看网址| 久久久精品动漫| 亚洲一区二区动漫| 成人手机在线免费视频| 亚洲va韩国va欧美va精品| 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美一区二区三区不卡| 亚洲欧美综合色| 国产又大又粗又长| 久久天堂av综合合色| 成人在线啊v| 国产91在线亚洲| 成人免费高清在线观看| 日韩精品一区二区不卡| 亚洲国产成人一区| 五月天国产在线| 欧美一区二区三区精美影视| 毛片一区二区| 精品一区二区三孕妇视频| 欧美日韩国产bt| 羞羞视频在线观看免费| 国产成人精品福利一区二区三区| 亚洲性图久久| 日批在线观看视频| 欧美性极品少妇精品网站| 国产在线视频网站| 国产在线久久久| 午夜国产欧美理论在线播放| 日本精品一二三区| 欧美日韩午夜剧场| 97视频精彩视频在线观看| 91精品久久久久久久久不口人| 91精品推荐| 欧美一级片黄色| 91高清在线观看| 老司机免费在线视频| 国产精品三区www17con| 亚洲大黄网站| www..com.cn蕾丝视频在线观看免费版| 欧美日韩美少妇| 亚洲91av| 欧美日韩亚洲免费| 国产一区二区三区日韩| 制服.丝袜.亚洲.中文.综合懂色| 亚洲色图av在线| 日韩精品一区国产| 日本久久久精品视频| 成人免费在线播放视频| 欧美一级性视频| 国产免费一区二区三区在线能观看 | 岛国毛片av在线| 日本精品一区二区| 国产一区二区三区香蕉| 亚洲婷婷综合网| 久久香蕉国产线看观看av| 天海翼精品一区二区三区| 天天色天天综合网| 色婷婷亚洲综合| 国产丝袜视频在线播放| 五码日韩精品一区二区三区视频|