一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

3天內不再提示

LambdaQueryWrapper遇上@Async

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

掃碼添加小助手

加入工程師交流群

文章背景

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

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

wKgZO2h0qe2AS6_FAANiXU5FIDM053.png


于是乎有了下述的探索

wKgZPGh0qe6AK-ccAAOZgbwBR5E034.png


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

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的優(yōu)勢

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

Spring Boot的@Async異步處理

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

基本配置

首先需要在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() {
        // 這個方法將在單獨的線程中執(zhí)行
        System.out.println("執(zhí)行異步方法: " + 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:異步統(tǒng)計與保存

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

高級應用與優(yōu)化

自定義線程池配置

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

@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) {
    // 這個更新操作將在新事務中執(zhí)行
    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);
    
    // 發(fā)送通知
    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);
}

性能考量與最佳實踐

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

總結

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

審核編輯 黃宇

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

    關注

    20

    文章

    2989

    瀏覽量

    109729
  • 代碼
    +關注

    關注

    30

    文章

    4900

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用BLE(CYW20829)作為SPI slave和MCU(TC387)作為SPI master,調試SPI通信時遇到的問題求解

    嘗試:調試過程中發(fā)現,slave 使用 cyhal_spi_slave_write時,rx中斷正常觸發(fā),看代碼該函數調用了 cyhal_spi_transfer_async。 問題:只有slave
    發(fā)表于 07-01 08:28

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

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

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

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

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

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

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

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

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

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

    請問如何制作CY7C65215 CyI2cWrite異步函數?

    ] STRUCT.CY_I2C_DATA_CONFIG* dataConfig,STRUCT.CY_DATA_BUFFER* WriteBuffer,UInt32超時); 我想知道如何在 Async 方法中實現它。 如果我過多地減少最后一個參數超時,就會發(fā)生寫入失敗。 您通常將超時時間設置為多長時間?
    發(fā)表于 05-07 07:31

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

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

    樹莓派遇上ChatGPT,魔法熱線就此誕生!

    盡管這種電話在幾十年前就已過時,但許多人都對旋轉撥號電話記憶猶新。這些舊電話,其實可以被改造成一個ChatGPT熱線。這個由PolluxLabs開發(fā)的項目,讓你可以將一部復古的旋轉撥號電話連接到樹莓派上,拿起聽筒、撥號,就能享受由AI驅動的對話,仿佛回到了傳統(tǒng)的電話時代。樹莓派負責語音識別、文本生成和語音播放,ChatGPT會記住通話中的每一句話。這意味著你
    的頭像 發(fā)表于 04-13 09:04 ?1632次閱讀
    樹莓派<b class='flag-5'>遇上</b>ChatGPT,魔法熱線就此誕生!

    進程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    :\"我去關火!\"( yield 控制權) 代碼示例(Python異步爬蟲): python import asyncio import aiohttp ? async def fetch
    發(fā)表于 03-26 09:27

    獲取具有三個輸出的自定義模型的輸出張量,運行時錯誤是怎么回事?

    () infer_request.start_async() infer_request.wait() output = infer_request.get_output_tensor() 打印(輸出) 收到的錯誤: 運行時錯誤:必須對只有一個參數的函數調用 get_output_tensor()。
    發(fā)表于 03-05 09:44

    普渡機器人PUDU SH1如何助力酒店服務升級

    當傳統(tǒng)清潔遇上人力短缺、效率瓶頸,酒店如何破局?
    的頭像 發(fā)表于 02-26 09:22 ?496次閱讀

    精密儀器檢測遇上索尼FCB-EV9520L:解鎖高效與精準的新篇章

    在高度精密與自動化的工業(yè)檢測領域,視頻設備作為“視覺之眼”,其性能直接關乎到生產線的效率與產品質量。當精密儀器檢測遇上索尼FCB-EV9520L模組一體化機芯控制板時,一場關于高效與精準的技術革新
    的頭像 發(fā)表于 12-05 11:09 ?439次閱讀

    IB Verbs和NVIDIA DOCA GPUNetIO性能測試

    Async 等技術,能夠創(chuàng)建以 GPU 為中心的應用程序,其中 CUDA 內核可以直接與網卡(NIC)通信,從而繞過 CPU 發(fā)送和接收數據包,并將 CPU 排除在關鍵路徑之外。
    的頭像 發(fā)表于 08-23 17:03 ?1360次閱讀
    IB Verbs和NVIDIA DOCA GPUNetIO性能測試

    一本小冊子,咋就讓IT人水靈靈地「由I變E」了?

    當IT圈遇上MBTI,看「I人」如何秒變「E人」!
    的頭像 發(fā)表于 08-12 14:28 ?1588次閱讀
    一本小冊子,咋就讓IT人水靈靈地「由I變E」了?