当前位置: 首页 > article >正文

Java 数据 01:MyBatis-Plus 复杂查询(Lambda+Wrapper 多条件)

MyBatis-Plus 的复杂查询是日常开发中最常用的功能之一尤其当条件动态、多字段组合、嵌套逻辑and/or、范围查询、分页排序等场景时LambdaQueryWrapper是目前2025–2026 年最推荐的方式。它比老的QueryWrapper更安全编译期就能发现字段名写错、更现代Lambda 方法引用、代码可读性更高。下面给你一个系统、由浅入深、覆盖 90% 真实场景的详解。1. 为什么选 LambdaQueryWrapper 而不是 QueryWrapper维度QueryWrapperLambdaQueryWrapper推荐场景2026共识字段安全字符串age改字段名易出错User::getAge编译期检查Lambda 完胜可读性一般极高像写 Java 代码LambdaIDE 提示弱字符串强方法引用跳转Lambda动态条件支持支持更优雅都行但 Lambda 更简洁嵌套 or/and需要嵌套 Wrapper支持 lambda 嵌套更直观Lambda 更友好社区主流老项目多新项目 95% 都在用 LambdaLambda结论新项目一律用 LambdaQueryWrapper老项目逐步迁移。2. 快速入门三种创建方式记一种就行// 方式1最推荐Wrappers 工具类LambdaQueryWrapperUserwrapperWrappers.UserlambdaQuery();// 方式2new 出来LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();// 方式3从 QueryWrapper 转偶尔用LambdaQueryWrapperUserwrappernewQueryWrapperUser().lambda();3. 常见条件方法速查Lambda 版需求代码示例User 实体生成的 SQL 片段大致等于 eq.eq(User::getAge, 18)age 18不等于 ne.ne(User::getStatus, 0)status 0大于 gt.gt(User::getScore, 90)score 90大于等于 ge.ge(User::getCreateTime, startDate)create_time ?小于 lt / le.lt(User::getAge, 30)age 30模糊 like.like(User::getName, 张)name LIKE %张%左模糊 likeLeft.likeLeft(User::getPhone, 138)phone LIKE 138%右模糊 likeRight.likeRight(User::getEmail, qq.com)email LIKE %qq.comin.in(User::getId, idsList)id IN (1,3,5)notIn.notIn(User::getRoleId, excludeRoles)role_id NOT IN (...)between.between(User::getAge, 18, 35)age BETWEEN 18 AND 35isNull / isNotNull.isNull(User::getDeleteTime)delete_time IS NULLorderByAsc / Desc.orderByAsc(User::getCreateTime)ORDER BY create_time ASCgroupBy.groupBy(User::getDeptId)GROUP BY dept_idhaving.having(count(*) {0}, 5)HAVING count(*) 54. 动态条件最常见场景publicListUserVOsearchUsers(UserQueryDTOdto){LambdaQueryWrapperUserwrapperWrappers.UserlambdaQuery()// 姓名模糊前端传空串也安全.like(StringUtils.isNotBlank(dto.getName()),User::getName,dto.getName())// 年龄范围两个都传才加 between.between(dto.getMinAge()!nulldto.getMaxAge()!null,User::getAge,dto.getMinAge(),dto.getMaxAge())// 状态枚举或 Integer.eq(dto.getStatus()!null,User::getStatus,dto.getStatus())// 注册时间范围LocalDateTime.ge(dto.getStartTime()!null,User::getCreateTime,dto.getStartTime()).le(dto.getEndTime()!null,User::getCreateTime,dto.getEndTime())// 部门多选in.in(CollectionUtils.isNotEmpty(dto.getDeptIds()),User::getDeptId,dto.getDeptIds())// 排序默认创建时间降序.orderByDesc(User::getCreateTime);returnuserMapper.selectList(wrapper);}5. 复杂嵌套and / or 组合——高频面试 生产痛点// 需求(姓名 like 张% OR 手机号 like 138%) AND 年龄 18 AND (状态1 OR 角色 in (2,3))LambdaQueryWrapperUserwrapperWrappers.UserlambdaQuery().and(w-w.likeRight(User::getName,张).or().likeLeft(User::getPhone,138)).ge(User::getAge,18).and(w-w.eq(User::getStatus,1).or().in(User::getRoleId,2,3));// 更复杂的嵌套三层.and(w-w.or(w1-w1.eq(User::getType,1).ge(User::getScore,90)).or(w2-w2.eq(User::getType,2).between(User::getAge,20,30)))小技巧嵌套层级多时用变量抽取子 wrapper可读性更好LambdaQueryWrapperUserorNameOrPhoneWrappers.UserlambdaQuery().likeRight(User::getName,search).or().likeLeft(User::getPhone,search);wrapper.and(orNameOrPhone::apply);// 注意 apply 写法6. 分页 排序 常用组合写法// IService / BaseMapper 通用分页IPageUserpageuserService.page(newPage(dto.getPageNum(),dto.getPageSize()),wrapper);// 或直接用 mapperIPageUserpageResultuserMapper.selectPage(newPage(1,10),wrapper);7. LambdaUpdateWrapper更新时也推荐// 批量逻辑删除软删LambdaUpdateWrapperUserupdateWrapperWrappers.UserlambdaUpdate().set(User::getDeleted,1).set(User::getDeleteTime,LocalDateTime.now()).in(User::getId,idList).eq(User::getDeleted,0);// 防止重复删userMapper.update(null,updateWrapper);// 涨积分条件更新LambdaUpdateWrapperUserincScoreWrappers.UserlambdaUpdate().setSql(score score 10).eq(User::getId,userId);userMapper.update(null,incScore);8. 2025–2026 最佳实践建议永远用Wrappers.lambdaQuery()/Wrappers.lambdaUpdate()创建动态条件用条件表达式, 字段, 值三元写法避免if包裹一堆.eq()模糊查询默认前后模糊敏感字段建议用likeRight/likeLeft时间范围统一用LocalDateTime避免时区坑索引友好排序字段、分组字段、频繁 where 字段要建索引大列表 in 查询超过 1000 条 → 分批或改用 join 子查询生产日志可通过wrapper.getSqlSegment()或 MyBatis-Plus 日志打印完整 SQL你现在遇到的具体场景是哪种前端多条件搜索姓名/手机号/时间范围/状态嵌套 or and 的权限过滤批量更新/逻辑删除分页 排序 统计告诉我 DTO 结构或需求我可以直接写出最合适的 wrapper 代码。

相关文章:

Java 数据 01:MyBatis-Plus 复杂查询(Lambda+Wrapper 多条件)

MyBatis-Plus 的 复杂查询 是日常开发中最常用的功能之一,尤其当条件动态、多字段组合、嵌套逻辑(and/or)、范围查询、分页排序等场景时,LambdaQueryWrapper 是目前(2025–2026 年)最推荐的方式。 它比老的…...

HTML + CSS + JavaScript 快速入门(三):JS 与 jQuery 实战

HTML CSS JavaScript 快速入门(三):JavaScript 与 jQuery 实战(2026 年视角) 这是系列第三讲,我们进入 JavaScript(简称 JS)核心内容,并对比经典的 jQuery。 2026 年的…...

HTML + CSS + JavaScript 快速入门(二):CSS 详解

HTML CSS JavaScript 快速入门(二):CSS 详解(2026 年视角) 这是系列第二讲,我们把 CSS(Cascading Style Sheets)讲透。 CSS 的核心使命:控制 HTML 元素的视觉呈现&…...

【香橙派】Orange Pi AIpro实战:昇腾AI算力加持下的YOLOv8部署与性能深度剖析

1. 香橙派Orange Pi AIpro开箱体验 第一次拿到这块开发板时,最直观的感受就是"分量十足"。包装盒里除了主板本体,还贴心地配备了散热风扇、电源适配器、Type-C数据线等全套配件。相比我之前用过的树莓派,Orange Pi AIpro的PCB板明显…...

Ubuntu双系统安装失败?天选5Pro的Intel RST问题全解析

天选5Pro双系统安装困境:Intel RST技术原理与实战解决方案 当技术爱好者们满怀期待地在新购置的天选5Pro笔记本上尝试安装Ubuntu双系统时,往往会遭遇一个令人困惑的障碍——安装程序无法识别磁盘设备。这个看似简单的硬件兼容性问题背后,实际…...

[MT8766][Android12] 无屏设备网络调试:定制热点配置与开机自启策略

1. 无屏设备网络调试的核心痛点 最近在开发一款基于MT8766芯片的Android12智能盒子时,遇到了一个典型问题:设备没有屏幕,但需要频繁进行调试和维护。传统的有线ADB连接方式在量产环境中并不实用,特别是当设备被部署在难以接触的位…...

知识图谱实战:利用Neo4j构建历史人物关系网络——以张学良家族为例

1. 知识图谱与Neo4j初探 第一次接触知识图谱时,我被它直观的网络结构深深吸引。想象一下,如果把历史人物关系画在一张巨大的白板上,用线条连接相关人物,这就是知识图谱最朴素的形态。而Neo4j就像是为这种关系网络量身定制的数字画…...

QMT中ContextInfo的逐K线机制解析与优化策略

1. ContextInfo逐K线机制的设计原理 在QMT量化交易系统中,ContextInfo是一个特殊的系统对象,它的行为模式与常规Python对象有着本质区别。理解这个机制的核心在于把握"逐K线更新"这个关键特性。想象你在看一本翻页动画书——只有当完整翻过一页…...

RTL8211E千兆PHY芯片PCB设计避坑指南:从电源分层到差分线等长

RTL8211E千兆PHY芯片PCB设计实战:规避高频信号陷阱的12个关键策略 在千兆以太网硬件设计中,RTL8211E作为主流PHY芯片方案,其PCB实现质量直接影响网络传输的稳定性和速率上限。许多工程师在完成原理图设计后,往往在PCB阶段遭遇信号…...

YOLOv8训练调优:从default.yaml配置文件解析到实战参数调整

1. 理解YOLOv8配置文件的核心结构 第一次打开YOLOv8的default.yaml配置文件时,我就像面对一本没有目录的技术手册。密密麻麻的参数让人眼花缭乱,但经过几个项目的实战后,我发现这些参数实际上可以分为几个逻辑清晰的模块。让我们像拆解乐高积…...

Prompt Programming - 从文字指令到认知引擎的编程革命

1. Prompt Programming的本质与演进 十年前,当我第一次接触AI编程时,需要花费数周时间训练模型、调整参数。如今,只需几行自然语言指令,就能让大语言模型完成复杂任务——这就是Prompt Programming带来的革命。 Prompt Programmin…...

BGP线路 vs 传统线路:如何为你的业务选择最佳服务器方案?

BGP线路与传统线路深度对比:企业级服务器选型实战指南 当企业业务规模扩张到需要跨地域服务时,服务器线路的选择直接决定了终端用户的访问体验。我曾为多家电商平台做过基础设施优化,最深刻的教训莫过于某次因线路选择不当导致的"南北互…...

你的AI助手真的懂你吗?手把手用EMER数据集评测多模态大模型的情感理解力

你的AI助手真的懂你吗?手把手用EMER数据集评测多模态大模型的情感理解力 当智能助手在你疲惫时主动建议休息,或在你焦虑时推荐深呼吸练习,这种"情感共鸣"背后究竟依赖怎样的技术逻辑?2024年问世的EMER数据集为开发者提供…...

Linux虚拟机与Windows主机文件互传:VMTools配置全攻略

1. 为什么需要VMTools文件互传功能 在日常开发中,我经常需要在Windows主机和Linux虚拟机之间来回传输文件。最开始我尝试用U盘拷贝,不仅效率低下,还经常遇到文件格式兼容性问题。后来发现VMTools提供的文件互传功能才是最佳解决方案。 这个功…...

ESP32驱动LED12864液晶屏:从字库调用到动态界面设计实战

1. ESP32与LED12864液晶屏的硬件连接 第一次用ESP32驱动LED12864液晶屏时,最让我头疼的就是接线问题。这种带字库的液晶屏通常采用SPI接口,但不同厂家的引脚定义可能有细微差别。我手头这块屏的引脚排列是标准的VCC、GND、CS、RST、RS、SDA、SCK&#xf…...

【latex】Latex表格宽度优化:利用\resizebox实现智能缩放与布局控制

1. 为什么需要调整表格宽度? 在撰写学术论文或技术文档时,表格是展示数据的重要工具。但经常遇到一个头疼的问题:精心设计的表格在编译后超出了页面边界,导致内容被截断或排版混乱。这种情况在数据密集型表格中尤为常见&#xff0…...

uniapp开发必看:iPhoneX底部黑条适配全攻略(附完整代码)

Uniapp开发实战:全面屏设备底部安全区域适配深度解析 第一次在iPhone X上测试我的Uniapp应用时,那个顽固的底部黑条让我彻夜难眠。作为一名经历过多次跨平台适配的老兵,我深知这个看似简单的问题背后隐藏着多少开发者的血泪史。今天&#xff…...

从零解析:手写一个JavaScript粒子系统(附新年烟花完整源码)

从零构建JavaScript粒子引擎:以新年烟花为例的实战开发指南 每当节日庆典来临,屏幕上绽放的数字烟花总能瞬间点燃欢乐氛围。这些看似复杂的视觉效果,其核心往往是一个精心设计的粒子系统。本文将带你从零开始,用JavaScript构建一个…...

用STM32CubeMX配置DP83848踩过的坑:从SMI通信失败到Ping成功的完整避坑指南

STM32CubeMX配置DP83848全流程避坑指南:从硬件排查到网络调试 最近在基于STM32F407和DP83848设计工业通信网关时,发现网络模块调试远比想象中复杂。即使使用STM32CubeMX这样的可视化配置工具,PHY芯片的初始化、RMII接口配置、SMI通信等环节依…...

三相不平衡电压下I型NPC三电平并网逆变器并网控制 1.采用正负序分离锁相环以及正序PI控制...

三相不平衡电压下I型NPC三电平并网逆变器并网控制 1.采用正负序分离锁相环以及正序PI控制,负序PI控制 2.采用中点电位平衡控制-零序电压注入法 3.采用SVPWM羊角波调制方式 4.提供参考文献 提供仿真源文件,电流环参数设计,正负序分离方法详解&…...

ARK服务器创世地图开服指南:如何用Mod和集群设置打造百倍资源专属服

ARK创世地图高阶开服指南:Mod集群与百倍资源调优实战 在ARK: Survival Evolved的私服生态中,创世地图因其独特的生物群落和任务系统成为进阶服主的热门选择。当基础搭建已不再是障碍,如何通过精细化Mod管理、跨地图数据集群和资源倍率调校打造…...

避坑指南:Seurat单细胞分析中,数据标准化(LogNormalize vs SCTransform)与PC数选择到底怎么选?

Seurat单细胞分析标准化方法与PC数选择的科学决策指南 1. 标准化方法的选择困境与解决方案 在单细胞RNA测序数据分析中,数据标准化是影响后续分析结果的关键步骤。Seurat提供了两种主流标准化方法:LogNormalize和SCTransform,它们各有特点&am…...

HTML常用布局详解:从基础到进阶的网页结构指南

在网页开发中,HTML布局是构建页面骨架的基础。合理的布局不仅能提升代码可维护性,还能直接影响用户体验和SEO效果。本文将系统梳理HTML中常用的布局方式,从传统表格布局到现代CSS布局技术,助你掌握网页结构设计的核心方法。 一、传…...

Qwen3-32B大模型企业级部署案例:基于优化镜像的API服务封装实践

Qwen3-32B大模型企业级部署案例:基于优化镜像的API服务封装实践 1. 企业级部署需求分析 在当今企业智能化转型过程中,大型语言模型的私有化部署需求日益增长。Qwen3-32B作为一款性能优异的中英双语大模型,在企业知识管理、智能客服、内容生…...

本地部署EmbeddingGemma-300m:Ollama让语义理解触手可及

本地部署EmbeddingGemma-300m:Ollama让语义理解触手可及 1. 为什么选择EmbeddingGemma-300m 在当今AI应用蓬勃发展的时代,文本嵌入技术已成为各类智能系统的核心组件。然而,大多数嵌入模型要么体积庞大、依赖高端硬件,要么性能不…...

Qwen3.5-9B开源大模型部署:Kubernetes集群化部署与自动扩缩容实践

Qwen3.5-9B开源大模型部署:Kubernetes集群化部署与自动扩缩容实践 1. 模型概述与技术特性 Qwen3.5-9B是通义千问团队推出的新一代开源大语言模型,在多项基准测试中展现出超越前代产品的性能表现。该模型采用创新的混合架构设计,特别适合企业…...

Python高效处理CLDAS-V2.0气象数据的NetCDF文件实战

1. 认识CLDAS-V2.0气象数据与NetCDF格式 第一次接触气象数据时,我被各种专业术语搞得晕头转向。直到用Python处理了CLDAS-V2.0数据集后,才发现气象数据可以这么有趣。CLDAS-V2.0是中国气象局发布的陆面数据同化系统产品,包含温度、降水、湿度…...

自动驾驶控制模块状态机的安全机制与实现策略

1. 自动驾驶控制模块状态机的核心安全机制 自动驾驶系统的可靠性直接关系到人身安全,而状态机作为控制模块的"大脑",其安全设计尤为重要。在实际项目中,我见过太多因为状态机设计缺陷导致的意外情况。比如某次路测中,车…...

Python 3.9环境下dlib库安装全攻略:从依赖配置到离线安装(附国内镜像源)

Python 3.9环境下dlib库高效安装指南:避坑实践与性能优化 在计算机视觉和机器学习领域,dlib库以其强大的人脸识别和特征检测功能而闻名。然而,许多开发者在Python 3.9环境下安装dlib时,往往会遇到各种棘手的依赖问题和编译错误。…...

告别纯CNN!用UNETR搞定三维医学图像分割:保姆级PyTorch+MONAI复现教程

UNETR三维医学图像分割实战:从PyTorch数据加载到MONAI模型部署全解析 医学影像分析领域正经历一场从传统CNN到Transformer架构的范式转移。当我们在处理CT、MRI这类三维体数据时,如何平衡全局上下文理解与局部特征提取成为模型设计的核心挑战。本文将带您…...