99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

LambdaQueryWrapper遇上@Async

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

掃碼添加小助手

加入工程師交流群

文章背景

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

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

wKgZO2h0qe2AS6_FAANiXU5FIDM053.png


于是乎有了下述的探索

wKgZPGh0qe6AK-ccAAOZgbwBR5E034.png


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

wKgZO2h0qe-AI0uuAAOZgbwBR5E369.png

MyBatis-Plus的LambdaQueryWrapper簡(jiǎn)介

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

基本用法示例

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

LambdaQueryWrapper的優(yōu)勢(shì)

類型安全:通過(guò)方法引用而非字符串指定字段,編譯器可檢查類型
代碼可讀性高:鏈?zhǔn)秸{(diào)用,語(yǔ)義清晰
防止SQL注入:自動(dòng)處理參數(shù)綁定
智能提示:IDE可自動(dòng)補(bǔ)全字段名

Spring Boot的@Async異步處理

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

基本配置

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

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

簡(jiǎn)單使用示例

@Service
public class AsyncService {

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

LambdaQueryWrapper與@Async的結(jié)合實(shí)踐

將兩者結(jié)合使用可以實(shí)現(xiàn)高效的異步數(shù)據(jù)庫(kù)操作,特別適合那些不需要立即返回結(jié)果的復(fù)雜查詢或批量操作。

示例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)計(jì)與保存

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

高級(jí)應(yīng)用與優(yōu)化

自定義線程池配置

默認(rèn)情況下,@Async使用SimpleAsyncTaskExecutor,這不是生產(chǎn)環(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;
    }
}

異常處理

異步方法的異常不會(huì)傳播到調(diào)用線程,需要特別處理:

@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());
    }
}

事務(wù)處理

@Async方法的事務(wù)需要特別注意,默認(rèn)情況下異步方法的事務(wù)不會(huì)傳播:

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

實(shí)際應(yīng)用場(chǎng)景

后臺(tái)報(bào)表生成

@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);
    
    // 生成報(bào)表文件
    generateExcelReport(users, reportPath);
    
    // 發(fā)送通知
    sendReportReadyNotification(reportPath);
}

批量數(shù)據(jù)處理

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

性能考量與最佳實(shí)踐

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

總結(jié)

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

審核編輯 黃宇

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

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109724
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    當(dāng)ASM焊線機(jī)遇上協(xié)議翻譯官:CC\\-Link IE轉(zhuǎn)Modbus RTU的節(jié)能數(shù)據(jù)之旅

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

    當(dāng)機(jī)器人遇上“語(yǔ)言障礙”:CCLINKIE轉(zhuǎn)Profinet的“破冰外掛”來(lái)啦\\!

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

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

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

    跨異步時(shí)鐘域處理方法大全

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

    當(dāng)沖壓焊接遇上Canopen到Profinet協(xié)議轉(zhuǎn)換網(wǎng)關(guān)

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

    請(qǐng)問如何制作CY7C65215 CyI2cWrite異步函數(shù)?

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

    HID免驅(qū)升級(jí)例程,基于nodejs編寫

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

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

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

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

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

    獲取具有三個(gè)輸出的自定義模型的輸出張量,運(yùn)行時(shí)錯(cuò)誤是怎么回事?

    () infer_request.start_async() infer_request.wait() output = infer_request.get_output_tensor() 打?。ㄝ敵觯?收到的錯(cuò)誤: 運(yùn)行時(shí)錯(cuò)誤:必須對(duì)只有一個(gè)參數(shù)的函數(shù)調(diào)用 get_output_tensor()。
    發(fā)表于 03-05 09:44

    普渡機(jī)器人PUDU SH1如何助力酒店服務(wù)升級(jí)

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

    精密儀器檢測(cè)遇上索尼FCB-EV9520L:解鎖高效與精準(zhǔn)的新篇章

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

    IB Verbs和NVIDIA DOCA GPUNetIO性能測(cè)試

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

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

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