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/10/29 20:25:09 阅读更多 →
嵌入式多核处理器技术解析:从同构异构架构到TI汽车通信应用实践

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

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

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

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

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

2026/11/2 11:51:48 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻