加班被丈夫赶出家门,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/7/23 8:01:04 阅读更多 →
四种光源真实对比:长弧氙灯、金卤灯、碘钨灯、白炽灯如何模拟太阳

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

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

2026/7/23 8:01:04 阅读更多 →
Java实战:ES256算法增强JWT安全性与Spring Security集成指南

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

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

2026/7/23 8:01:04 阅读更多 →

最新新闻

大模型对话界面的流式渲染引擎:SSE 到 Markdown 的实时管道

大模型对话界面的流式渲染引擎:SSE 到 Markdown 的实时管道

大模型对话界面的流式渲染引擎:SSE 到 Markdown 的实时管道 一、SSE 长连接:为什么选它不选 WebSocket 对话产品要的是"模型生成 → 客户端消费"的单向推送。WebSocket 是双向通道,对纯对话场景能力过剩,还得自己管心跳…

2026/7/23 18:12:27 阅读更多 →
全新AU-48降噪模组:一芯解决六大音频痛点

全新AU-48降噪模组:一芯解决六大音频痛点

破解设备音频行业核心痛点 做对讲、会议、车载、安防、智能穿戴设备研发,你是否常年被音频难题困扰? 户外风噪、空调风扇轰鸣、车辆鸣笛、机械敲击杂音盖过人声;设备喇叭与麦克风距离近,开大音量就啸叫、回音刺耳;全双…

2026/7/23 18:12:27 阅读更多 →
树莓派玩转openwrt软路由:3.烧录OpenWrt固件至树莓派

树莓派玩转openwrt软路由:3.烧录OpenWrt固件至树莓派

1、获取OpenWrt固件前面介绍到了如何进行编译属于自己的固件,你可以选择自己编译好的固件也可以选择官方的固件,初学者推荐官方固件。进入OpenWrt官方网站:https://OpenWrt.org/方式一:下载设备的固件映像(固件选择器&…

2026/7/23 18:12:27 阅读更多 →
成本降62%,响应快4.8倍,客户满意度升37%:AI智能体客服系统规模化落地的12个关键决策点

成本降62%,响应快4.8倍,客户满意度升37%:AI智能体客服系统规模化落地的12个关键决策点

更多请点击: https://codechina.net 第一章:AI智能体客服系统规模化落地的价值跃迁 当单点AI客服模块升级为可编排、可协同、可演进的智能体系统,并在万级并发、千场景覆盖、百业务线联动的规模下稳定运行时,价值逻辑发生根本性重…

2026/7/23 18:12:27 阅读更多 →
ARM Cortex-M系统控制寄存器实战:软件复位与时钟门控详解

ARM Cortex-M系统控制寄存器实战:软件复位与时钟门控详解

1. 项目概述与核心价值 在嵌入式开发,尤其是基于ARM Cortex-M内核的微控制器项目中,我们常常会遇到两个看似简单却至关重要的需求:如何在不重启整个系统的情况下,让某个“卡死”的外设(比如UART串口)恢复正…

2026/7/23 18:12:27 阅读更多 →
深入解析Tiva™微控制器复位机制:从原理到实战的嵌入式系统稳定性设计

深入解析Tiva™微控制器复位机制:从原理到实战的嵌入式系统稳定性设计

1. 微控制器复位机制:系统稳定性的基石 在嵌入式系统开发中,尤其是工业控制、汽车电子或物联网设备这类对可靠性要求极高的领域,我们常常把注意力集中在功能实现、算法优化和性能调优上。然而,一个经常被新手甚至部分有经验的开发…

2026/7/23 18:11:27 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻