news 2026/4/23 11:08:37

Mybatis-Plus中QueryWrapper 与 LambdaQueryWrapper 的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mybatis-Plus中QueryWrapper 与 LambdaQueryWrapper 的区别

QueryWrapper 与 LambdaQueryWrapper 的区别

1.基本区别

QueryWrapper

java

// 使用字符串表示字段名 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "张三") .gt("age", 18) .like("email", "@qq.com");

LambdaQueryWrapper

java

// 使用Lambda表达式引用字段 LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(User::getName, "张三") .gt(User::getAge, 18) .like(User::getEmail, "@qq.com");

2.核心区别对比

特性QueryWrapperLambdaQueryWrapper
字段引用方式字符串硬编码Lambda表达式
类型安全性编译期不检查字段是否存在编译期检查,类型安全
重构友好性重命名字段需手动修改字符串IDE自动重构
代码可读性一般更好,直接关联实体类
性能相同相同
防SQL注入都防SQL注入都防SQL注入

3.详细对比

3.1 类型安全性

java

// QueryWrapper - 编译期不报错,运行时报错 queryWrapper.eq("nam", "张三"); // 拼写错误,编译时不检查 // LambdaQueryWrapper - 编译期报错 lambdaWrapper.eq(User::getNam, "张三"); // 编译时报错:找不到getNam方法

3.2 重构友好性

java

// QueryWrapper - 重命名需要手动修改 // 假设把字段 name 改为 username queryWrapper.eq("name", "张三"); // ❌ 需要手动改为 "username" // LambdaQueryWrapper - IDE自动重构 lambdaWrapper.eq(User::getName, "张三"); // ✅ 重命名实体类字段时自动更新

3.3 复杂查询对比

java

// QueryWrapper QueryWrapper<CapitalInfo> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(capitalName)) { queryWrapper.like("capital_name", capitalName); } if (capitalYear != null) { queryWrapper.eq("capital_year", capitalYear); } // LambdaQueryWrapper LambdaQueryWrapper<CapitalInfo> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.like(StringUtils.isNotBlank(capitalName), CapitalInfo::getCapitalName, capitalName) .eq(capitalYear != null, CapitalInfo::getCapitalYear, capitalYear);

4.实际使用示例

QueryWrapper 使用场景

java

// 1. 动态字段名(字段名是变量) String fieldName = getFieldNameFromRequest(); // 可能是 "name" 或 "username" QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq(fieldName, "张三"); // Lambda方式无法实现 // 2. 复杂动态SQL拼接 QueryWrapper<User> wrapper = new QueryWrapper<>(); if (condition1) { wrapper.eq("field1", value1); } else { wrapper.isNull("field1"); } if (condition2) { wrapper.in("field2", Arrays.asList(1, 2, 3)); } // 3. 表连接查询 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("u.status", 1) .eq("r.role_type", "admin") .apply("u.role_id = r.id");

LambdaQueryWrapper 使用场景

java

// 1. 常规查询(推荐) LambdaQueryWrapper<CapitalInfo> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CapitalInfo::getCapitalState, 1) .like(CapitalInfo::getCapitalName, "测试") .orderByDesc(CapitalInfo::getCreateTime); // 2. 链式调用 List<CapitalInfo> list = capitalInfoMapper.selectList( new LambdaQueryWrapper<CapitalInfo>() .eq(CapitalInfo::getCapitalYear, 2024) .in(CapitalInfo::getCapitalType, Arrays.asList("A", "B", "C")) .groupBy(CapitalInfo::getCapitalSource) ); // 3. 条件判断简化 LambdaQueryWrapper<CapitalInfo> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(queryDTO.getCapitalState() != null, CapitalInfo::getCapitalState, queryDTO.getCapitalState()) .like(StringUtils.isNotBlank(queryDTO.getCapitalName()), CapitalInfo::getCapitalName, queryDTO.getCapitalName());

5.性能比较

两者在性能上没有区别,最终都会转换为相同的SQL语句:

sql

-- 两者生成的SQL相同 SELECT * FROM capital_info WHERE capital_state = 1 AND capital_name LIKE '%测试%' ORDER BY create_time DESC

6.最佳实践建议

推荐使用 LambdaQueryWrapper 的情况:

  1. 查询条件固定,字段名不会动态变化

  2. 注重代码可维护性和类型安全

  3. 实体类字段可能重构的情况

  4. 新项目开发,优先使用Lambda方式

推荐使用 QueryWrapper 的情况:

  1. 字段名需要动态生成

  2. 多表连接查询,涉及多个表的字段

  3. 处理遗留代码,保持一致性

  4. 构建复杂动态SQL,使用字符串更灵活

7.混合使用示例

java

// 可以使用QueryWrapper的lambda()方法 QueryWrapper<CapitalInfo> wrapper = new QueryWrapper<>(); wrapper.lambda() // 转换为Lambda方式 .eq(CapitalInfo::getCapitalState, 1) .like(CapitalInfo::getCapitalName, "测试"); // 或者反过来 LambdaQueryWrapper<CapitalInfo> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(CapitalInfo::getCapitalState, 1); QueryWrapper<CapitalInfo> queryWrapper = lambdaWrapper.getWrapper(); // 可以继续添加字符串方式的查询条件 queryWrapper.apply("DATE(create_time) = CURDATE()");

8.结论

方面推荐原因
新项目开发LambdaQueryWrapper类型安全,重构友好
字段名固定LambdaQueryWrapper减少硬编码错误
字段名动态QueryWrapper灵活性强
代码可读性LambdaQueryWrapper直观明了
兼容性QueryWrapper所有场景都适用

建议:在大部分业务场景下,优先使用LambdaQueryWrapper,因为它提供了更好的开发体验和代码安全性。只有在需要动态字段名或处理复杂SQL时,才使用QueryWrapper

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 1:53:29

JAVA分块上传功能视频传输应用案例

咱是一名福建的“老码农”&#xff0c;最近接了个外包项目&#xff0c;客户要做大文件上传功能&#xff0c;要求还挺细——原生JS实现、20G文件传输、文件夹保留层级、加密传输存储、断点续传兼容IE9… 预算还卡在100块以内&#xff08;老板说“小项目不搞虚的”&#xff09;。…

作者头像 李华
网站建设 2026/4/18 10:03:57

如何用Sambert-HifiGan打造个性化语音导航系统?

如何用Sambert-HifiGan打造个性化语音导航系统&#xff1f; &#x1f4cc; 业务场景与技术挑战 在智能出行、车载系统和无障碍服务中&#xff0c;个性化语音导航正成为提升用户体验的关键环节。传统的导航语音多为固定录音或机械合成音&#xff0c;缺乏情感表达和定制化能力&am…

作者头像 李华
网站建设 2026/4/18 15:19:16

Sambert-HifiGan在智能玩具中的创新应用

Sambert-HifiGan在智能玩具中的创新应用 引言&#xff1a;让智能玩具“有情感”地说话 随着AI语音技术的不断演进&#xff0c;语音合成&#xff08;Text-to-Speech, TTS&#xff09; 已从机械朗读迈向自然、富有情感的表达。尤其在智能硬件领域&#xff0c;如儿童陪伴机器人、…

作者头像 李华
网站建设 2026/4/9 16:41:54

借助AI工具快速生成高质量学术范儿的开题报告PPT模板推荐

AI工具开题报告生成能力对比速览 工具名称 生成速度 内容完整度 参考文献质量 适用场景 AIbiye ⚡⚡⚡⚡ ⭐⭐⭐⭐ 15真实文献 理工科开题 AICheck ⚡⚡⚡ ⭐⭐⭐⭐⭐ 自动匹配领域 人文社科类 秒篇 ⚡⚡⚡⚡⚡ ⭐⭐⭐ 基础文献支持 紧急需求 AskPaper ⚡…

作者头像 李华
网站建设 2026/4/22 14:31:32

推荐使用AI工具高效完成具有学术规范的开题报告PPT设计

AI工具开题报告生成能力对比速览 工具名称 生成速度 内容完整度 参考文献质量 适用场景 AIbiye ⚡⚡⚡⚡ ⭐⭐⭐⭐ 15真实文献 理工科开题 AICheck ⚡⚡⚡ ⭐⭐⭐⭐⭐ 自动匹配领域 人文社科类 秒篇 ⚡⚡⚡⚡⚡ ⭐⭐⭐ 基础文献支持 紧急需求 AskPaper ⚡…

作者头像 李华
网站建设 2026/4/18 0:01:27

用CTGAN生成医疗合成数据

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 CTGAN在医疗合成数据生成中的革命性应用&#xff1a;隐私保护与价值挖掘目录CTGAN在医疗合成数据生成中的革命性应用&#xff1a;隐私保护与价值挖掘 引言&#xff1a;医疗数据的困境与合成数据的曙光 一、现在时&#x…

作者头像 李华