伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

LambdaQueryWrapper遇上@Async

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2025-07-14 14:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

文章背景

最近在測試業務需求時通讀了研發指定需求的代碼,發現研發大佬們用到了如下的內容,有些內容我還不是十分的清楚,比如下述真實代碼;作為后端大佬肯定爐火純青,但是我剛剛看到這段代碼時確實有點懵;

快速理解的方式
直接借助joycoder解釋代碼的能力就可以快速理解

wKgZO2h0qe2AS6_FAANiXU5FIDM053.png


于是乎有了下述的探索

wKgZPGh0qe6AK-ccAAOZgbwBR5E034.png


但是我為了理解的透徹點還是又去翻找了一些其它資料做一個記錄吧,后續萬一在遺忘了也方便快速查找

wKgZO2h0qe-AI0uuAAOZgbwBR5E369.png

MyBatis-Plus的LambdaQueryWrapper簡介

LambdaQueryWrapper是MyBatis-Plus提供的一種類型安全的查詢條件構造器,它利用Java 8的Lambda表達式特性,避免了硬編碼字段名,提高了代碼的可讀性和可維護性。

基本用法示例

LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(User::getName, "張三")
           .ge(User::getAge, 18)
           .orderByDesc(User::getCreateTime);
List userList = userMapper.selectList(queryWrapper);

LambdaQueryWrapper的優勢

類型安全:通過方法引用而非字符串指定字段,編譯器可檢查類型
代碼可讀性高:鏈式調用,語義清晰
防止SQL注入:自動處理參數綁定
智能提示:IDE可自動補全字段名

Spring Boot的@Async異步處理

@Async是Spring框架提供的注解,用于標記方法為異步執行。被@Async注解的方法會在調用時立即返回,而實際執行將發生在單獨的線程中。

基本配置

首先需要在Spring Boot啟動類或配置類上添加@EnableAsync注解:

@SpringBootApplication
@EnableAsync
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

簡單使用示例

@Service
public class AsyncService {

    @Async
    public void asyncMethod() {
        // 這個方法將在單獨的線程中執行
        System.out.println("執行異步方法: " + Thread.currentThread().getName());
    }
}

LambdaQueryWrapper與@Async的結合實踐

將兩者結合使用可以實現高效的異步數據庫操作,特別適合那些不需要立即返回結果的復雜查詢或批量操作。

示例1:異步查詢用戶列表

@Service
@RequiredArgsConstructor
public class UserService {
    
    private final UserMapper userMapper;
    
    @Async
    public CompletableFuture> asyncFindUsers(String name, Integer minAge) {
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
        queryWrapper.like(StringUtils.isNotBlank(name), User::getName, name)
                   .ge(minAge != null, User::getAge, minAge);
        
        List users = userMapper.selectList(queryWrapper);
        return CompletableFuture.completedFuture(users);
    }
}

示例2:異步統計與保存

@Async
public void asyncStatAndSave(Long departmentId) {
    // 統計部門人數
    LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
    queryWrapper.eq(User::getDepartmentId, departmentId);
    long count = userMapper.selectCount(queryWrapper);
    
    // 更新統計結果
    Department department = new Department();
    department.setId(departmentId);
    department.setUserCount(count);
    departmentMapper.updateById(department);
    
    // 記錄統計日志
    StatLog statLog = new StatLog();
    statLog.setDepartmentId(departmentId);
    statLog.setCount(count);
    statLog.setStatTime(LocalDateTime.now());
    statLogMapper.insert(statLog);
}

高級應用與優化

自定義線程池配置

默認情況下,@Async使用SimpleAsyncTaskExecutor,這不是生產環境的最佳選擇。我們可以自定義線程池:

@Configuration
public class AsyncConfig implements AsyncConfigurer {
    
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("AsyncExecutor-");
        executor.initialize();
        return executor;
    }
}

異常處理

異步方法的異常不會傳播到調用線程,需要特別處理:

@Async
public CompletableFuture> asyncFindUsersWithExceptionHandling(String name) {
    try {
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
        queryWrapper.like(User::getName, name);
        List users = userMapper.selectList(queryWrapper);
        return CompletableFuture.completedFuture(users);
    } catch (Exception e) {
        // 記錄日志
        log.error("異步查詢用戶失敗", e);
        // 返回空列表或拋出CompletionException
        return CompletableFuture.completedFuture(Collections.emptyList());
    }
}

事務處理

@Async方法的事務需要特別注意,默認情況下異步方法的事務不會傳播:

@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void asyncUpdateWithTransaction(User user) {
    // 這個更新操作將在新事務中執行
    userMapper.updateById(user);
}

實際應用場景

后臺報表生成

@Async
public void asyncGenerateUserReport(LocalDate startDate, LocalDate endDate, String reportPath) {
    LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
    queryWrapper.between(User::getCreateTime, startDate.atStartOfDay(), endDate.atTime(23, 59, 59))
               .orderByAsc(User::getCreateTime);
    
    List users = userMapper.selectList(queryWrapper);
    
    // 生成報表文件
    generateExcelReport(users, reportPath);
    
    // 發送通知
    sendReportReadyNotification(reportPath);
}

批量數據處理

@Async
public CompletableFuture asyncBatchProcessUsers(List userIds) {
    LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
    queryWrapper.in(User::getId, userIds);
    
    List users = userMapper.selectList(queryWrapper);
    
    int processedCount = 0;
    for (User user : users) {
        if (processUser(user)) {
            processedCount++;
        }
    }
    return CompletableFuture.completedFuture(processedCount);
}

性能考量與最佳實踐

合理使用異步:不是所有數據庫操作都適合異步,簡單查詢同步執行可能更高效
控制并發量:避免過多并發數據庫連接導致系統資源耗盡
批量操作優化:考慮使用MyBatis-Plus的批量操作方法
結果處理:使用CompletableFuture可以方便地處理異步結果
監控:監控異步任務的執行情況和線程池狀態

總結

MyBatis-Plus的LambdaQueryWrapper與Spring Boot的@Async注解的結合,為Java后端開發提供了強大的工具組合。LambdaQueryWrapper提供了類型安全、優雅的查詢構建方式,而@Async則讓異步編程變得簡單。合理使用這兩者可以顯著提高應用程序的響應速度和處理能力,特別是在處理復雜查詢、批量操作和后臺任務時。
在實際項目中,開發者應根據具體場景選擇合適的技術組合,并注意線程池配置、異常處理和事務管理等關鍵點,以確保系統的穩定性和可靠性。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3003

    瀏覽量

    116651
  • 代碼
    +關注

    關注

    30

    文章

    4973

    瀏覽量

    74184
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    當匯川PLC遇上施耐德變頻器,疆鴻智能EtherNet/IP轉Modbus TCP給它倆當翻譯

    當匯川PLC遇上施耐德變頻器,疆鴻智能EtherNet/IP轉Modbus TCP給它倆當翻譯 去年秋天,我們在蘇州一個固體制劑車間里遇到了一臺“固執”的干法制粒機和一臺“自閉”的微創手術器械裝配線
    的頭像 發表于 03-19 14:53 ?117次閱讀
    當匯川PLC<b class='flag-5'>遇上</b>施耐德變頻器,疆鴻智能EtherNet/IP轉Modbus TCP給它倆當翻譯

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】充分發揮硬件潛力

    )(struct dma_chan *chan); struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( struct dma_chan
    發表于 02-04 22:30

    當頂流Clawdbot遇上AIMO,個人AI Agent迎來“實體化”革命!

    “對話”的局限,通過連接本地系統與多終端工具,實現從信息交互到物理執行的跨越,讓“個人AI管家”從概念走向現實。而當這場AI執行革命遇上高算力AI模組領軍者美格智能
    的頭像 發表于 02-02 12:42 ?648次閱讀
    當頂流Clawdbot<b class='flag-5'>遇上</b>AIMO,個人AI Agent迎來“實體化”革命!

    當EtherCAT遇上PROFINET:我們的“協議小翻譯”讓礦井安全手拉手

    當EtherCAT遇上PROFINET:我們的“協議小翻譯”讓礦井安全手拉手 炎夏的鋼鐵車間里,巨型軋機正以精確的節奏吞吐著赤紅的鋼坯。就在今晨,這條產線剛剛完成了一場靜默的變革——我們成功將倍福
    的頭像 發表于 10-22 10:00 ?361次閱讀
    當EtherCAT<b class='flag-5'>遇上</b>PROFINET:我們的“協議小翻譯”讓礦井安全手拉手

    如何在香橙派5 Plus上移植deepin 25操作系統

    當開源生態遇上極客硬件,會碰撞出怎樣的火花?當 deepin 25 遇上香橙派 5 Plus 開發板,又會帶來什么樣的實踐體驗?
    的頭像 發表于 10-11 10:29 ?1083次閱讀

    ulog輸出異常-中斷與線程打印沖突怎么解決?

    CONFIG_ULOG_LINE_BUF_SIZE=128 CONFIG_ULOG_USING_ASYNC_OUTPUT=y CONFIG_ULOG_ASYNC_OUTPUT_BUF_SIZE=2048
    發表于 09-28 11:44

    掘金AI時代計算產業紅利的商業伙伴,為什么跟華為組隊?

    當先進算力遇上伙伴體系,按下行業數智化加速鍵
    的頭像 發表于 08-27 09:33 ?3735次閱讀
    掘金AI時代計算產業紅利的商業伙伴,為什么跟華為組隊?

    蘸一點數據之墨,為宇宙寫首《天問》

    當高能物理遇上前年之問,OceanStor Pacific交出高能答案
    的頭像 發表于 08-19 10:34 ?1167次閱讀
    蘸一點數據之墨,為宇宙寫首《天問》

    電磁遇上熱與應力-CST多物理場仿真解決復雜工程挑戰

    當電磁遇上熱與應力,CST MPhysics Studio提供真正的全耦合多物理場仿真能力。電磁-熱耦合、熱失諧分析、熱-機械耦合、電磁-機械耦合,解決復雜工程挑戰。
    的頭像 發表于 07-29 16:21 ?985次閱讀
    電磁<b class='flag-5'>遇上</b>熱與應力-CST多物理場仿真解決復雜工程挑戰

    當ASM焊線機遇上協議翻譯官:CC\\-Link IE轉Modbus RTU的節能數據之旅

    車間環境,讓數據流穩定無虞。 實戰瞬間:電流監測難題迎刃而解 某電子廠在部署能源管理系統時遭遇上述困境。工程師在ASM焊線機與Modbus RTU能耗平臺間部署協議網關: 配置: 通過網頁快速設定
    發表于 06-26 14:38

    當機器人遇上“語言障礙”:CCLINKIE轉Profinet的“破冰外掛”來啦\\!

    在汽車焊裝車間的技術角,工程師小陳的筆記本記滿了“跨協議難題”:當搭載Profinet的庫卡機器人遇上CCLINKIE總線的三菱PLC,數據交互像隔著玻璃喊話——PLC發送的坐標指令要“繞地球半圈
    發表于 06-04 14:31

    CANoe產品體系19版本新功能(下)

    NET 8.0現已支持測試腳本、應用模型和仿真節點的開發,支持C# 12,可使用async/await進行等待,本機編譯實現快速加載,改進應用層對象的API實現處理復雜數據類型,并支持運行在Linux版本CANoe SE中。
    的頭像 發表于 05-29 14:05 ?2556次閱讀
    CANoe產品體系19版本新功能(下)

    跨異步時鐘域處理方法大全

    該方法只用于慢到快時鐘域的1bit信號傳遞。在Xilinx器件中,可以使用(* ASYNC_REG = "TRUE" *)標記,將兩個寄存器盡量靠近綜合,降低 亞穩態因導線延遲太大而傳播到第二個寄存器的可能性。
    的頭像 發表于 05-14 15:33 ?1597次閱讀
    跨異步時鐘域處理方法大全

    當沖壓焊接遇上Canopen到Profinet協議轉換網關

    Profinet
    小疆智控
    發布于 :2025年05月13日 15:09:54

    HID免驅升級例程,基于nodejs編寫

    async function usbhid_main()?{? ?// 打印所有參數? ?let path = args[0];? ?console.log('\n歡迎使用USB HID
    發表于 04-28 17:58 ?0次下載