加班被丈夫赶出家门,HR 辞退我,只因分不清 LambdaQueryWrapper 和 BaseMapper

发布时间:2026/7/23 8:00:21

加班被丈夫赶出家门,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 辅助课件 UI 生成:从教学大纲到交互界面的端到端方案

AI 辅助课件 UI 生成:从教学大纲到交互界面的端到端方案

2026/7/23 7:50:20

AI 辅助课件 UI 生成:从教学大纲到交互界面的端到端方案 一、引言:一份 20 页的教学大纲,应该直接变成 20 个交互页面 教育的数字化进程中有一个效率黑洞:课程设计师用 Word 写了详细的教学大纲,UI 设计师把大纲&quo…

粉笔公考APP用户量对比华图在线中公网校

粉笔公考APP用户量对比华图在线中公网校

2026/7/23 7:50:20

引言:公考备考工具的用户规模对比 每年国考、省考报名季前后,"考公"相关话题都会进入公众视野。数百万考生进入备考状态,与之相伴的是公考类APP之间的用户规模与服务能力差异。在常见备考工具中,粉笔、华图在线、中公网…

Unity与ROS集成:构建高保真机器人仿真系统的架构与实现

Unity与ROS集成:构建高保真机器人仿真系统的架构与实现

2026/7/23 7:50:20

1. 项目概述:为什么是UnityROS?如果你正在做机器人,无论是机械臂、移动底盘还是无人机,大概率都听过ROS。ROS(Robot Operating System)这套开源框架,几乎成了机器人软件开发的“普通话”&#x…

UE5 C++基础框架设计:事件系统、数据管理与对象池实战

UE5 C++基础框架设计:事件系统、数据管理与对象池实战

2026/7/23 8:50:23

1. 项目概述:为什么UE5 C项目需要一套基础功能框架? 如果你是从蓝图转向C的UE开发者,或者刚接触UE5 C的新手,大概率会遇到一个困境:每次开新项目,都要从零开始搭建那些“轮子”。比如,怎么优雅地…

C++实现卡尔曼滤波:原理、代码与工程实践指南

C++实现卡尔曼滤波:原理、代码与工程实践指南

2026/7/23 8:50:23

1. 项目概述与核心价值最近在做一个机器人定位相关的项目,不可避免地要跟传感器数据打交道。无论是IMU的角速度、加速度,还是GPS的经纬度,甚至是视觉里程计给出的位姿,这些数据都带着“噪声”和“不确定性”。直接拿来用&#xff…

C++状态模式实战:告别面条式代码,实现优雅状态管理

C++状态模式实战:告别面条式代码,实现优雅状态管理

2026/7/23 8:50:23

1. 项目概述:为什么我们需要状态模式? 干了这么多年C,从桌面应用到游戏引擎,再到嵌入式系统,我处理过无数需要根据对象内部状态改变其行为的场景。最典型的例子,就是一个自动售货机:它有空闲、…

Qwen-Image-Edit-2511 角色三视图工作流

Qwen-Image-Edit-2511 角色三视图工作流

2026/7/23 8:50:23

一、工作流在做什么 这个工作流的输入是一张 低质量卡通形象,输出是一张 清晰的"正视图、侧视图、背视图"三视图角色表(提示词原文:生成正视图、侧视图、背视图\n清晰)。 从生产链路看,它解决的是一个非常典型的需求:把一张随手画的草图 / 低清头像,重绘成可…

Python暴力破解RAR密码:从字典优化到多进程加速的实用技巧

Python暴力破解RAR密码:从字典优化到多进程加速的实用技巧

2026/7/23 8:50:23

1. 项目概述与核心思路最近在论坛上看到不少朋友在讨论RAR压缩包密码忘了怎么办,评论区总有人开玩笑说“等一个破解版”或者“蹲一个好心人分享密码”。说实话,这种被动等待基本等于放弃。作为一个经常和数据、脚本打交道的人,我处理过不少类…

AWS 税务信息怎么填写?NiceCloud 带你快速入门

AWS 税务信息怎么填写?NiceCloud 带你快速入门

2026/7/23 8:40:23

不少用户在注册或使用 AWS 国际站时,都会在 Billing(账单)相关页面看到 AWS 税务信息、Tax Settings、Tax Registration Number 这些选项。尤其是第一次接触 AWS 的个人开发者、跨境业务团队,或者企业用户,往往会有几个…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击: https://kaifayun.com 第一章:企业级AI搜索落地选型实战手册(含LLMRAGHybrid架构对比矩阵与ROI测算模板) 企业级AI搜索系统落地成败,核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,深入理解并熟练配置芯片的片上外设,是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文,近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…