精品欧美一区二区三区在线观看 _久久久久国色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在线一区二区| 欧美成人黑人xx视频免费观看| 波多野结衣之无限发射| 理论片中文字幕| 午夜一级在线看亚洲| 亚洲日韩欧美视频| 欧美日韩理论片| 91破解版在线观看| 国产欧美日韩在线视频| 亚洲一区二区三区在线免费观看| 国产亚洲精品久久久久久打不开 | 污视频在线观看免费网站| av日韩国产| 国产精品福利在线播放| 国产精品一区二区三区在线| 免费观看日批视频| 精品成人在线| 中文字幕亚洲二区| www.17c.com喷水少妇| 国产精品99| 婷婷成人激情在线网| 亚洲一区二区三区午夜| 日批免费在线观看| 国产一区二区导航在线播放| 欧美诱惑福利视频| 欧美国产日韩综合| 欧美一区二区三区激情视频| 精品精品欲导航| 色戒在线免费观看| 自拍网站在线观看| 亚洲图片欧美视频| 异国色恋浪漫潭| 国产九色在线| 91视频观看视频| www.一区二区三区| 99国产在线播放| 强制捆绑调教一区二区| 欧美一级大片视频| 国产大片aaa| 中文字幕人成人乱码| 日韩在线不卡视频| 在线免费观看视频| 五月天亚洲色图| 亚洲第一精品夜夜躁人人爽| 亚洲高清av一区二区三区| 99热一区二区三区| 日韩激情一区二区三区| 欧美日韩1区| 久久成人亚洲精品| 性欧美疯狂猛交69hd| 欧美一区二区三区高清视频| 亚洲一级黄色av| 人妻无码一区二区三区| 欧美重口另类| 亚洲精品国产美女| 捆绑裸体绳奴bdsm亚洲| 欧美xxxx在线| 亚洲激情小视频| av黄色一级片| 国产极品模特精品一二| 精品国免费一区二区三区| 91大神免费观看| 日本一区二区三区视频在线看| 在线成人午夜影院| 久国产精品视频| 精品中文字幕一区二区三区| 日韩一卡二卡三卡国产欧美| 欧美色图校园春色| 成人资源在线播放| 日韩精品中文在线观看| 精品人妻无码一区二区三区| 美女毛片一区二区三区四区最新中文字幕亚洲| 日韩精品黄色网| www在线观看免费视频| 日韩激情图片| 九九热这里只有在线精品视| 欧美精品一区二区成人| 亚洲国产精品一区| 国产成人精品久久二区二区| 国产女优在线播放| 国产精品一区二区久久不卡| 成人av免费在线看| 日韩大片b站免费观看直播| 久久综合网色—综合色88| 日韩久久久久久久久久久久久| www 日韩| 亚洲自拍偷拍网站| 无码人妻丰满熟妇区毛片18| 丰满少妇一区| 欧美xfplay| 欧美日韩高清丝袜| 欧美激情第二页| 欧美一区二区色| 少妇一级淫片日本| 国产69精品久久久久毛片| 免费日韩av电影| 黄网站在线播放| 亚洲成av人片一区二区梦乃| 亚洲无吗一区二区三区| 一区二区视频| 在线免费看av不卡| 久久久久亚洲av成人片| 日韩精品五月天| 2020国产精品久久精品不卡| 免费在线性爱视频| 夜夜精品视频一区二区 | 欧美性受xxxx黑人xyx性爽| 亚洲理论中文字幕| 欧美理论电影在线精品| 久久久精品欧美| 五月婷婷视频在线| 国产精品一区在线| 日韩精品久久一区二区三区| 伊人手机在线| 欧美三级视频在线观看| www国产视频| 亚洲国产精品成人| 国产精品女主播视频| 五月激情婷婷综合| 亚洲美女屁股眼交3| 亚洲中文字幕久久精品无码喷水| 视频一区中文字幕精品| 色婷婷综合久久久久| 一级成人黄色片| 成人免费看的视频| 久久久国产精华液999999| 黑人巨大亚洲一区二区久| 日韩视频免费直播| 午夜精品一区二区三级视频| 久久久久久久欧美精品| 国产综合动作在线观看| 色呦呦呦在线观看| 制服丝袜亚洲网站| 成人欧美一区二区三区黑人一| 亚洲永久网站| 国产精品一区视频网站| 在线免费观看的av| 欧美电影在线免费观看| 国精产品久拍自产在线网站| 日本伊人精品一区二区三区观看方式| 精品欧美日韩在线| 草草在线视频| 亚洲第一区在线| 久久久久99精品| 粉嫩嫩av羞羞动漫久久久| 玖玖精品在线视频| 在线日韩三级| 深夜精品寂寞黄网站在线观看| 成人h动漫精品一区二区下载| 91污片在线观看| 久久久久久久久久久视频| 日韩mv欧美mv国产网站| 97久久久久久| 天天在线女人的天堂视频| 亚洲超碰97人人做人人爱| 超碰caoprom| 99国产精品久久久久久久成人热 | 国产手机精品视频| 亚洲另类在线一区| 中文写幕一区二区三区免费观成熟| 999国产精品视频| 95av在线视频| 黄页在线观看免费| 亚洲国产成人精品久久久国产成人一区| 丰满少妇高潮久久三区| 成人免费视频视频在线观看免费| 国产欧美日韩小视频| 人人香蕉久久| 国产成人精品亚洲精品| 91青青在线视频| 69p69国产精品| 免费又黄又爽又色的视频| 成人中文字幕在线| 国产xxxxx在线观看| 欧美国产偷国产精品三区| 91综合免费在线| 搞黄网站在线看| 亚洲欧美另类自拍| 一级片视频播放| 亚洲综合一二三区| 精品人妻一区二区三区日产乱码卜| 亚洲永久免费精品| 日本黄色播放器| 国产96在线亚洲| 日本精品视频在线播放| 欧美18hd| 亚洲国产欧美久久| 国产一级精品毛片| 樱花影视一区二区| 亚洲 小说 欧美 激情 另类| 激情综合网天天干| 狠狠干 狠狠操| 欧美高清在线| 久久免费看av| 国产精品久久久久久av公交车| 久久久久国产视频| av黄色在线观看| 亚洲成av人乱码色午夜| 久久这里只有精品9| 一区二区三区四区在线免费观看 | 欧美激情一区三区| 日韩高清一二三区| 日韩影院精彩在线| 欧美视频在线第一页| 精品国产一区二区三区久久久蜜臀| 成人欧美在线视频| 依依综合在线| 九九热这里只有精品6| 成人综合影院| 日韩av一区二区在线| 一级片一区二区三区| 欧美日韩国产页| 中文字幕在线有码| 国产欧美日本一区视频| 手机免费看av片| 经典一区二区三区| 日韩欧美xxxx| 亚洲国产美女| 女人色极品影院| 日韩在线观看一区| 久久伦理网站| 卡通动漫精品一区二区三区| 亚洲a级在线播放观看| 秋霞国产精品| 欧美自拍视频在线观看| av电影在线地址| 久久精品最新地址| av免费在线一区二区三区| 亚洲视频在线观看| 色视频在线观看免费| 亚洲国产精彩中文乱码av在线播放 | 国产精品视频中文字幕91| 天堂中文av在线资源库| 久久久亚洲福利精品午夜| gogo在线高清视频| 久久精品电影网| 自拍视频在线免费观看| 国产亚洲精品久久久优势| 神马亚洲视频| 日韩成人在线网站| 天天射天天操天天干| 欧美精品一区二区三区蜜桃视频| 国产成人免费看一级大黄| 91麻豆精品国产91久久久久久久久 | 亚洲福利国产| 97在线国产视频| 国产一区亚洲| 欧美国产综合在线| 激情综合网址| 日日碰狠狠添天天爽超碰97| 一本一本久久| 成人免费观看毛片| 首页综合国产亚洲丝袜| 日本新janpanese乱熟| 美女视频一区免费观看| 能在线观看的av网站| 毛片av一区二区三区| 日本超碰在线观看| 国产呦萝稀缺另类资源| 国产男女无遮挡猛进猛出| 国产mv日韩mv欧美| 精品视频站长推荐| 2024国产精品| 欧美人妻一区二区三区| 国产精品久久久一本精品| 久久99久久99精品免费看小说| 亚洲欧美经典视频| 国产一级理论片| 黑人狂躁日本妞一区二区三区 | 国产精品综合| 国产一级片黄色| 精品一二线国产| 亚洲熟女一区二区三区| 91视频精品在这里| 欧美88888| 亚洲一区二区在线播放相泽| 圆产精品久久久久久久久久久| 欧美视频在线观看 亚洲欧| www.五月婷婷.com| 日韩一区二区中文字幕| 少妇av在线播放| 一区二区三区国产视频| 91精品久久| 欧美亚洲国产视频| 日韩伦理一区二区| 国产精品自拍首页| 成人a'v在线播放| 亚洲精品天堂成人片av在线播放 | 天天插天天操天天射| 国产一区不卡视频| 中文字幕丰满孑伦无码专区| 中文字幕在线观看不卡| 亚洲综合一二三| 欧美群妇大交群中文字幕| 天堂在线视频免费| 色偷偷偷亚洲综合网另类 | 亚洲精品亚洲人成人网在线播放| 国产真实的和子乱拍在线观看| 日本丰满少妇一区二区三区| a视频免费在线观看| 亚洲男人av电影| 日本资源在线| 国产精品视频大全| 欧美18xxxx| 4444在线观看| 视频一区在线视频| 欧美xxxxx精品| 亚洲欧美偷拍三级| 国产乱码77777777| 亚洲国产精品系列| av毛片在线免费| 国产精品日韩久久久久| 色婷婷久久久| www.亚洲成人网| 国产在线精品国自产拍免费| 九色porny自拍视频| 亚洲成人自拍偷拍| 国产乱码久久久久| 在线视频日本亚洲性| 高潮在线视频| 99视频免费观看| 888久久久| 在线观看国产一级片| 久久久久久久网| 日本熟妇一区二区| 欧美α欧美αv大片| www.欧美日本韩国| 国产在线观看不卡| 日韩在线中文| 视频二区在线播放| 国产欧美一区二区三区沐欲| 在线免费黄色av| 日韩精品久久久久久久玫瑰园| 18av在线视频| 亚洲已满18点击进入在线看片 | 蜜桃精品视频| 亚洲国产精品影视| 久久丁香综合五月国产三级网站| 亚洲精品国产熟女久久久| 色综合久久天天综合网| 天天操天天操天天干| 欧美高清不卡在线| 日韩有吗在线观看| 欧美日韩dvd| 国产精品1区二区.| 国产精品老熟女一区二区| 欧美一区二区久久| 午夜dj在线观看高清视频完整版| 91在线无精精品一区二区| 欧美91精品| 精人妻一区二区三区| 一二三区精品福利视频| 刘亦菲久久免费一区二区| 久久久久女教师免费一区| 国产精品极品在线观看| 精品视频免费在线播放| 91丨九色丨蝌蚪富婆spa| 中文在线第一页| 在线观看国产精品淫| 精品国产黄a∨片高清在线| 在线视频一区观看| 国产传媒日韩欧美成人| 日本少妇裸体做爰| 国产丝袜精品视频| 99九九久久| 亚洲成人动漫在线| 福利一区二区在线观看| 日韩欧美不卡视频| 亚洲区免费影片| 久久亚洲精品人成综合网| 麻豆中文字幕在线观看| 国产成人精品网址| 国产乱国产乱老熟| 色七七影院综合| 91成人噜噜噜在线播放| www一区二区www免费| 欧美韩日一区二区三区| 国产精品天天操| 91极品视频在线| av中文字幕一区二区| 性欧美在线视频| 亚洲v中文字幕| a天堂在线资源| 99se婷婷在线视频观看| 亚洲专区一区| 色哟哟一一国产精品| 精品国产伦一区二区三区免费| 日韩伦理在线一区| 在线无限看免费粉色视频| 不卡欧美aaaaa| 伊人免费在线观看| 国产综合在线看| 日韩欧美大片| 国产麻豆剧传媒精品国产av| 在线国产电影不卡| www中文字幕在线观看| 一本久久a久久精品vr综合| 成人午夜又粗又硬又大| 国产乱码在线观看| 51久久精品夜色国产麻豆|