MyBatis-Plus03:条件构造器
一、条件构造器MyBatis-PlusMP的核心优势之一就是通过Wrapper体系尤其是QueryWrapper和UpdateWrapper提供了强大、灵活且类型安全的动态 SQL 构建能力特别擅长处理复杂的 WHERE 条件。1-1、AbstractWrapper1、QueryWrapper UpdateWrapperQueryWrapper 在where条件的基础上可以控制多加了select 可选的查询字段。默认是select *1QueryWrapper 示例2updateWrapper示例UpdateWrapper第一个参数传null是因为你不提供实体对象如果你传了实体MP 会把实体中非空字段也加入 SET可能造成意料之外的覆盖。⚠️ 注意事项如果你有实体对象并且想更新它的某些字段 按主键更新也可以用User user new User(); user.setId(1001); user.setNickname(新昵称); userMapper.updateById(user); // 更简洁这种情况不需要UpdateWrapper。小结场景推荐方式按主键更新几个字段updateById(entity)按非主键条件更新update(null, updateWrapper)动态条件/字段更新UpdateWrapper或LambdaUpdateWrapper2、AbstractLambdaWrapper以上的queryWrapper 和 updateWrapper 字段名都是写死的硬编码。二、小结三、QueryWrapper VS UpdateWrapper3-1、一句话区分Wrapper用途核心能力QueryWrapper查询、删除只构造WHERE条件UpdateWrapper更新构造WHERE条件SET更新内容3-2、继承关系AbstractWrapper ← 所有 Wrapper 的基类构造 WHERE ├── QueryWrapper ← 只负责 WHERE ├── UpdateWrapper ← 负责 WHERE SET └── LambdaQueryWrapper / LambdaUpdateWrapper ← 各自对应的 Lambda 版本UpdateWrapper 比 QueryWrapper 多了一个set()方法用来指定要更新的字段和值。3-3、代码对比同一个业务场景场景把年龄大于 30 且状态为禁用的用户状态改为启用。❌ 错误用 QueryWrapper 做更新// QueryWrapper 只能构造 WHERE没法指定 SET 内容 QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.gt(age, 30).eq(status, 0); // update() 方法需要传入一个实体对象作为 SET 内容 User user new User(); user.setStatus(1); // 要更新的字段值放在实体里 userMapper.update(user, queryWrapper);缺点实体user中其他字段如果为null配合not_null策略会被忽略但你得new一个对象逻辑上条件和更新内容分离不够直观✅ 正确用 UpdateWrapper 做更新UpdateWrapperUser updateWrapper new UpdateWrapper(); // WHERE 条件年龄 30 且 状态 0 updateWrapper.gt(age, 30).eq(status, 0); // SET 内容直接在这里指定 updateWrapper.set(status, 1); // 还可以同时更新多个字段 updateWrapper.set(update_time, new Date()); userMapper.update(null, updateWrapper);优点条件和更新内容写在一起一目了然第一个参数传null完全不需要 new 实体对象可以更新为nullset(phone, null)不受实体 null 策略影响3-4、什么时候用哪个决策树你要做什么操作 │ ├─→ 查询SELECT─────────────────→ QueryWrapper / LambdaQueryWrapper │ 例list(wrapper)、getOne(wrapper)、count(wrapper) │ ├─→ 删除DELETE─────────────────→ QueryWrapper / LambdaQueryWrapper │ 例remove(wrapper) │ 删除只需要条件不需要 SET │ └─→ 更新UPDATE─────────────────→ UpdateWrapper / LambdaUpdateWrapper 例update(null, wrapper) 更新既需要 WHERE 条件又需要 SET 内容3-5、Lambda 版本推荐实际使用上面用的是字符串硬编码列名容易写错。实际开发强烈推荐 Lambda 版本LambdaQueryWrapper —— 查询/删除// 查询名字包含张且状态启用的用户 LambdaQueryWrapperUser lqw new LambdaQueryWrapper(); lqw.like(User::getUsername, 张) .eq(User::getStatus, 1); ListUser list userMapper.selectList(lqw);LambdaUpdateWrapper —— 更新// 更新id1 的用户只改邮箱和更新时间 LambdaUpdateWrapperUser luw new LambdaUpdateWrapper(); luw.eq(User::getId, 1L) .set(User::getEmail, newqq.com) .set(User::getUpdateTime, new Date()); userMapper.update(null, luw);Lambda 的好处User::getUsername是编译期检查的列名写错直接编译报错不会等到运行时才暴露。3-6、一个完整的实战对比Service public class UserService { Autowired private UserMapper userMapper; // 查询用 QueryWrapper public ListUser getActiveUsersByAge(Integer minAge) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.ge(User::getAge, minAge) // WHERE age ? .eq(User::getStatus, 1); // AND status 1 return userMapper.selectList(wrapper); } // 删除用 QueryWrapper public boolean deleteInactiveUsers() { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.eq(User::getStatus, 0) // WHERE status 0 .lt(User::getCreateTime, LocalDateTime.now().minusYears(1)); // AND create_time 一年前 return userMapper.delete(wrapper) 0; } // 更新用 UpdateWrapper public boolean banUsersByAge(Integer maxAge) { LambdaUpdateWrapperUser wrapper new LambdaUpdateWrapper(); wrapper.le(User::getAge, maxAge) // WHERE age ? .eq(User::getStatus, 1) // AND status 1 .set(User::getStatus, 0) // SET status 0 .set(User::getUpdateTime, LocalDateTime.now()); // SET update_time now() return userMapper.update(null, wrapper) 0; } }3-7、容易踩的坑坑说明UpdateWrapper 做查询语法上可行因为继承了 AbstractWrapper但语义不对别这么干QueryWrapper 做更新但没传实体update(null, queryWrapper)→ SET 子句为空SQL 报错UpdateWrapper 传了实体又用了 set()两者会合并实体和 set() 都会进 SET 子句注意别重复忘记update(null, wrapper)第一个参数用 UpdateWrapper 时第一个参数固定传null3-8、速记口诀查删用 Query更新用 Update。Query 只管 WHEREUpdate 还能 SET。

相关新闻

深度解析:如何零成本接入30+顶级大语言模型API资源

深度解析:如何零成本接入30+顶级大语言模型API资源

深度解析:如何零成本接入30顶级大语言模型API资源 【免费下载链接】free-llm-api-resources A list of free LLM inference resources accessible via API. 项目地址: https://gitcode.com/GitHub_Trending/fre/free-llm-api-resources 在AI技术快速发展的今…

2026/7/27 9:31:25 阅读更多 →
嵌入式多核处理器技术解析:从同构异构架构到TI汽车通信应用实践

嵌入式多核处理器技术解析:从同构异构架构到TI汽车通信应用实践

1. 多核处理器:从概念到嵌入式系统的必然选择在嵌入式系统开发领域,尤其是汽车电子和通信基础设施这类对性能、功耗和实时性要求都极为苛刻的行业,单核处理器的性能天花板早已触手可及。当系统需要同时处理高清视频流分析、复杂的雷达信号滤波…

2026/7/27 9:31:25 阅读更多 →
【SkyWalking从入门到精通】第72篇:SkyWalking指标基线与异常检测——超越静态阈值告警的智能监控

【SkyWalking从入门到精通】第72篇:SkyWalking指标基线与异常检测——超越静态阈值告警的智能监控

下一篇【第71篇】日志与Trace关联——通过TraceId快速定位日志的完整方案 上一篇【第73篇】SkyWalking 8.x新特性全解析——浏览器监控、eBPF、MAL与Satellite 一、静态阈值的尴尬 假设你为"服务响应时间>500ms"设置了告警。这个规则看起来合理,但在实…

2026/7/27 9:31:25 阅读更多 →

最新新闻

Heimer思维导图软件终极指南:跨平台开源解决方案

Heimer思维导图软件终极指南:跨平台开源解决方案

Heimer思维导图软件终极指南:跨平台开源解决方案 【免费下载链接】Heimer Heimer is a simple cross-platform mind map, diagram, and note-taking tool written in Qt. 项目地址: https://gitcode.com/gh_mirrors/he/Heimer 在信息过载的数字化时代&#x…

2026/7/27 9:48:31 阅读更多 →
3个核心功能让你从游戏玩家变身为英雄联盟电影导演

3个核心功能让你从游戏玩家变身为英雄联盟电影导演

3个核心功能让你从游戏玩家变身为英雄联盟电影导演 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirector 你是否曾观看英雄联盟职…

2026/7/27 9:48:31 阅读更多 →
云服务如何重塑AI教育:从架构革新到教学实践

云服务如何重塑AI教育:从架构革新到教学实践

1. 云服务巨头如何重塑AI教育生态国内两大云服务商在AI教育领域的布局早已超出简单的资源供给层面。去年参加某教育科技峰会时,我亲眼目睹了华为云展示的AI实训平台如何通过动态资源调度,将传统需要2小时部署的机器学习环境缩短至90秒。这种底层能力的突…

2026/7/27 9:48:31 阅读更多 →
SpringBoot+ELK构建企业级日志管理系统实战

SpringBoot+ELK构建企业级日志管理系统实战

1. 项目概述:SpringBoot日志管理信息系统的核心价值日志管理是任何信息系统不可或缺的组成部分,尤其在分布式架构和微服务盛行的当下。这个基于SpringBoot的毕业设计项目,瞄准了企业级日志管理的痛点——如何高效收集、存储、分析和可视化系统…

2026/7/27 9:48:31 阅读更多 →
Java台球赛事报名系统开发与优化实践

Java台球赛事报名系统开发与优化实践

1. 项目概述:Java台球赛事报名系统的核心价值 这个开源Java台球赛事报名系统为中小型台球俱乐部和赛事组织者提供了一个完整的数字化解决方案。我在实际部署测试中发现,它完美解决了传统纸质报名和Excel管理的三大痛点:信息混乱、统计困难和流…

2026/7/27 9:48:31 阅读更多 →
3个简单步骤!用N_m3u8DL-RE轻松下载任何流媒体视频

3个简单步骤!用N_m3u8DL-RE轻松下载任何流媒体视频

3个简单步骤!用N_m3u8DL-RE轻松下载任何流媒体视频 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

2026/7/27 9:47:31 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻