加班被丈夫赶出家门,HR 辞退我,只因分不清 LambdaQueryWrapper 和 BaseMapper
MyBatis-Plus 核心组件关系BaseMapper、IService、QueryWrapper、LambdaQueryWrapper 大白话讲解一、先看一张关系图心中有数┌──────────────────────────────────────────────────────┐ │ IServiceT │ │ Service层接口继承自...谁往下看 │ │ │ │ 内部持有一个 BaseMapperT给它加了很多便捷方法 │ │ 比如 saveBatch()、saveOrUpdate() 等批量/链式操作 │ └──────────────┬───────────────────────────────────────┘ │ 包装 / 增强 ▼ ┌──────────────────────────────────────────────────────┐ │ BaseMapperT │ │ Mapper层接口最底层的数据库操作 │ │ │ │ 方法签名长这样 │ │ selectList(QueryWrapperT wrapper) │ │ selectOne(QueryWrapperT wrapper) │ │ update(T entity, QueryWrapperT wrapper) │ │ delete(QueryWrapperT wrapper) │ └──────────────┬───────────────────────────────────────┘ │ 方法参数用的是 ▼ ┌──────────────────────────────────────────────────────┐ │ AbstractWrapperT, R, Children │ │ 抽象父类 │ │ / \ │ │ QueryWrapperT LambdaQueryWrapperT │ │ 字符串写列名 Lambda写列名 │ │ │ │ eq(name, 张三) eq(User::getName, 张三) │ │ 容易写错编译不报错 IDE帮你检查不怕字段改名 │ └──────────────────────────────────────────────────────┘二、BaseMapper — 最底层的干活的一句话BaseMapper 就是你和数据库之间的直通车定义最基本的增删改查方法。// 你写的接口publicinterfaceUserMapperextendsBaseMapperUser{// 不用写任何代码BaseMapper 自带了// insert()、deleteById()、updateById()、selectById()// selectList()、selectPage() 等等}你需要知道的重点BaseMapper 里那些带条件的方法selectList、update、delete等参数都接收一个 Wrapper。Wrapper 就是条件构造器用来告诉数据库我要查/改/删哪些记录你不传 Wrapper → 查全表传了 Wrapper → 按条件筛选。// 不传条件 → 查全表userMapper.selectList(null);// 传条件 → 只查名字叫张三的userMapper.selectList(newQueryWrapperUser().eq(name,张三));三、IService — BaseMapper 的加装套餐一句话IService 不干新活它只是把 BaseMapper 包装了一下让你用起来更爽。// 你的 Service 接口publicinterfaceUserServiceextendsIServiceUser{}// 你的 Service 实现类ServicepublicclassUserServiceImplextendsServiceImplUserMapper,User// ← 这行绑定了 BaseMapperimplementsUserService{}IService 比 BaseMapper 多出来什么BaseMapper 的方法IService 多出来的方法insert(T entity)saveBatch(CollectionT)批量插入updateById(T entity)saveOrUpdate(T)有ID就更新没ID就插入selectList(Wrapper)list()直接查全表不用传 null 了返回int影响行数save()返回boolean成功/失败本质上ServiceImpl里面持有一个BaseMapperIService 所有的批量/便捷方法底层还是调的 BaseMapper。只是帮你省了循环和判断的代码。// 用 BaseMapper你得手动判断UseruseruserMapper.selectById(1L);if(usernull){userMapper.insert(newUser);}else{userMapper.updateById(newUser);}// 用 IService一行搞定userService.saveOrUpdate(newUser);四、QueryWrapper — 用字符串拼条件传统方式一句话把 SQL 的 WHERE 条件用 Java 代码拼出来列名写成字符串。QueryWrapperUserwrappernewQueryWrapper();wrapper.eq(name,张三)// WHERE name 张三.like(email,qq.com)// AND email LIKE %qq.com%.gt(age,18)// AND age 18.orderByDesc(create_time);// ORDER BY create_time DESCListUserusersuserMapper.selectList(wrapper);缺点很明显// 字段名写错了编译不报错运行时才发现wrapper.eq(naem,张三);// 应该是 name写成了 naem// 数据库字段改名了要全局搜索字符串容易漏掉wrapper.eq(create_time,...);// 如果改成了 gmt_create这里不会提示五、LambdaQueryWrapper — 用 Lambda 写列名推荐方式一句话跟 QueryWrapper 干一样的事但列名用实体类::get方法来写编译期就能检查错误。LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.eq(User::getName,张三)// 用 Lambda 引用字段.like(User::getEmail,qq.com).gt(User::getAge,18).orderByDesc(User::getCreateTime);ListUserusersuserMapper.selectList(wrapper);优点// 字段名写错了IDE 直接标红编译都过不了wrapper.eq(User::getNaem,张三);// 编译报错// 字段改名了用 IDE 的重构功能一键改名所有引用自动更新它怎么做到的Lambda 表达式User::getName在 Java 里是一种叫SFunction的东西MyBatis-Plus 会从里面解析出字段名name然后再拼 SQL。这个过程叫“序列化 Lambda 解析”。六、他们之间的调用关系用代码串一遍// 第 1 步定义实体 DataTableName(user)publicclassUser{privateLongid;privateStringname;privateIntegerage;privateStringemail;}// 第 2 步定义 Mapper继承 BaseMapper publicinterfaceUserMapperextendsBaseMapperUser{}// 第 3 步定义 Service继承 IService publicinterfaceUserServiceextendsIServiceUser{}ServicepublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsUserService{// ServiceImpl 内部自动绑定了 UserMapper}// 第 4 步在 Controller 里用 RestControllerpublicclassUserController{AutowiredprivateUserServiceuserService;// IService 层AutowiredprivateUserMapperuserMapper;// BaseMapper 层// 方式一用 BaseMapper LambdaQueryWrapperpublicListUsergetAdults(){LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.gt(User::getAge,18);returnuserMapper.selectList(wrapper);// BaseMapper 的方法}// 方式二用 IService 的便捷方法底层还是调 BaseMapperpublicListUsergetAdults2(){LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.gt(User::getAge,18);returnuserService.list(wrapper);// IService 的方法等价于上面}// 方式三用 IService 的链式调用LambdaQueryChainWrapperpublicListUsergetAdults3(){returnuserService.lambdaQuery().gt(User::getAge,18).list();// 连 Wrapper 都不用自己 new}}七、LambdaQueryChainWrapper — 最偷懒的写法如果你用 Service 层IService还可以更省事——链式调用// 不用自己 new LambdaQueryWrapperuserService.lambdaQuery().eq(User::getName,张三).gt(User::getAge,18).list();// 查列表userService.lambdaUpdate().eq(User::getName,张三).set(User::getAge,20).update();// 更新这个lambdaQuery()返回的就是一个LambdaQueryChainWrapper它帮你把LambdaQueryWrapper和BaseMapper的调用包在了一起你只管一直.下去就行了。八、总结什么时候用什么场景用什么原因简单单表 CRUD不用条件IService的save()、getById()等比 Mapper 多返回 boolean、批量操作带条件的查询/更新/删除LambdaQueryWrapper编译期检查字段名不怕写错用 Service 层 条件查询.lambdaQuery().xxx.list()最省代码链式一路点到底复杂 SQL多表 JOIN直接在 Mapper.xml 写 SQLWrapper 只适合单表多表老老实实写 SQL核心关系再捋一遍BaseMapper 数据库操作的底层接口方法参数用 Wrapper 传条件IService 包装了 BaseMapper加了批量/链式/布尔返回值的便捷方法QueryWrapper 用字符串写列名拼条件传统但容易出错LambdaQueryWrapper 用 Lambda 写列名拼条件编译期安全强烈推荐LambdaQueryChainWrapperlambdaQuery()返回的东西把 Wrapper Mapper 调用合成一条链写起来最爽一句话记牢IService 包着 BaseMapperBaseMapper 吃着 WrapperLambda 是 Wrapper 的升级版用 Lambda 代替字符串列名。

相关新闻

提质增效再加速 | 东棠AI速创「填空式」短视频创作功能焕新上线!

提质增效再加速 | 东棠AI速创「填空式」短视频创作功能焕新上线!

当下线上获客竞争持续加剧,短视频已成为企业、商家引流获客的核心抓手。但多数用户仍面临脚本创作难、制作门槛高、内容试错成本高的困境,不少AI短视频创作工具仅停留在基础剪辑层面,与用户“低成本、高产出、易上手”的诉求存在差距。为贴合…

2026/11/14 4:59:49 阅读更多 →
四种光源真实对比:长弧氙灯、金卤灯、碘钨灯、白炽灯如何模拟太阳

四种光源真实对比:长弧氙灯、金卤灯、碘钨灯、白炽灯如何模拟太阳

户外的太阳条件没法重复。天气一变、季节一换、地理位置不同,辐照强度和光谱分布全在漂。但实验室测试不能这样,它需要稳定、可控的光源,否则结果根本没法对比。太阳光模拟器就是可以用人工光源在光谱组成、色温、辐照度和能量分布上&#xf…

2026/11/14 4:23:48 阅读更多 →
Java实战:ES256算法增强JWT安全性与Spring Security集成指南

Java实战:ES256算法增强JWT安全性与Spring Security集成指南

1. 项目概述:为什么是ES256? 在构建现代Web应用或微服务架构时,身份认证和授权是绕不开的核心环节。JWT(JSON Web Token)因其自包含、无状态和易于跨域传输的特性,成为了实现这一环节的主流方案。你可能已…

2026/11/13 22:45:07 阅读更多 →

最新新闻

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

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

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

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

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

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

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

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

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

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

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

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

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

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

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

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

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

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

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻