当前位置: 首页 > news >正文

Mybatis-plus 中 LambdaQueryWrapper和QueryWrapper 区别对比,及完整示例演示

Mybatis-Plus 中 LambdaQueryWrapperQueryWrapper 是两种用于构造 SQL 查询条件的工具类,它们的核心区别在于 类型安全性语法简洁性。以下是详细对比及完整示例:


一、核心区别对比

特性LambdaQueryWrapperQueryWrapper
类型安全✅ 编译期校验(基于 Lambda 表达式)❌ 运行时校验(基于字符串表达式)
代码可读性✅ 直接引用实体类属性(如 q -> q.getAge()❌ 需手写字段名字符串(如 "age"
IDE 支持✅ 自动补全、智能提示❌ 无提示,依赖开发者记忆字段名
空值处理✅ 自动识别 null 值(无需显式判断 isNull)❌ 需手动拼接 isNullisEmpty
适用场景✅ 新项目优先推荐✅ 兼容旧版 Mybatis-Plus(<=2.x)

二、完整示例演示

1. 环境准备
// 实体类 User
@Data
public class User {private Long id;private String name;private Integer age;
}// Mapper 接口
public interface UserMapper extends BaseMapper<User> {}
2. 使用 QueryWrapper(传统方式)
// 注意:字段名必须与数据库一致,否则会抛出异常!
@Test
void testQueryWrapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "Tom")   // 字段名需严格匹配数据库列名.ge("age", 18)        // 年龄大于等于 18.likeRight(true, "name", "J"); // 模糊查询(右侧匹配)// 执行查询List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
3. 使用 LambdaQueryWrapper(推荐方式)
@Test
void testLambdaQueryWrapper() {// 创建 LambdaQueryWrapper 实例(泛型推断更安全)LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();lambdaQuery.eq(User::getName, "Tom")      // 方法引用,自动获取字段名.ge(User::getAge, 18)          // 年龄 >= 18.likeRight(User::getName, "J"); // 模糊查询(右侧匹配)// 执行查询List<User> users = userMapper.selectList(lambdaQuery);users.forEach(System.out::println);
}
4. 关键差异解析
  • 类型安全示例
    如果修改实体类字段名(如将 name 改为 userName),LambdaQueryWrapper 会在编译时报错,而 QueryWrapper 仅在运行时报错:

    // 错误示范(会导致编译失败):
    lambdaQuery.eq(User::getNonExistField, "value");// QueryWrapper 的错误示例(运行时才会发现):
    queryWrapper.eq("nonExistField", "value");
    
  • 空值处理优化
    LambdaQueryWrapper 自动识别 null 值,无需手动添加 isNull

    lambdaQuery.eq(User::getAge, null); // 自动转换为 IS NULL
    

三、如何选择?

  1. 新项目开发:优先使用 LambdaQueryWrapper,减少因字段名变更导致的故障。
  2. 旧项目迁移:逐步替换 QueryWrapper,利用其兼容性过渡。
  3. 复杂动态 SQL:混合使用两种 Wrapper(如 Wrapper.apply() 嵌套)。

四、扩展补充

  • 动态表名/特殊函数:仍需使用 QueryWrapper 拼接原生 SQL。
  • 性能对比:两者生成的 SQL 完全一致,性能无差异。
  • IDE 插件:安装 Lombok 增强工具可提升 Lambda 开发体验。

通过以上示例可以看出,LambdaQueryWrapper 在现代 Java 开发中具有显著优势,是 Mybatis-Plus 的最佳实践推荐方式。

http://www.dtcms.com/a/269879.html

相关文章:

  • 大型语言模型(LLM)的最新研究进展及相关新信息技术
  • 如何在 Android Framework层面控制高通(Qualcomm)芯片的 CPU 和 GPU。
  • 在Docker中安装nexus3(作为maven私服)
  • 使用Node.js搭建Web应用有哪些注意事项?
  • 中韩SD-WAN网络加速专线:提升国内与韩国公司网络性能的关键
  • 四十四、NoSQL、Redis
  • Docker、Git与虚拟机:技术原理与深度对比(更新版)
  • 【网络安全】恶意 Python 包“psslib”仿冒 passlib,可导致 Windows 系统关闭
  • 【王树森推荐系统】召回12:曝光过滤 Bloom Filter
  • Java面试基础:概念
  • FairyGUI 实现 Boss 双层血条动画
  • 3D 演示动画在汽车培训与教育领域中的应用
  • 从0开始学习R语言--Day41--Moran‘s I
  • 城乡社区服务体系建设-城乡商城:意义深远与前景广阔——仙盟创梦IDE
  • 把文件夹下所有的excle写入word文件中
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | StickyNavbar(粘性导航栏)
  • Qwen视觉模型本地化部署,实现识别图片:Qwen2___5-VL-7B-Instruct
  • 分布式光纤传感:为储能安全保驾护航
  • 2025年7月:打cs1.5 600元装机台式电脑方案A
  • 学习软件测试的第十二天(接口测试)
  • Spring Security架构与实战全解析
  • 人工智能-基础篇-24-RAG和LLM到底怎么理解和区分?(LLM是深度训练的大语言生成模型,RAG是LLM更智能的补充技术)
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(1):新的开始-尊他开始
  • 【无标题】导出pdf
  • 数据库版本自动管理
  • MVP架构接口开发套路
  • TCP/IP协议基础
  • mybatis/mybatis-plus添加数据,自增id的值为负数
  • 第十四天,7月8日,八股
  • 《UE5_C++多人TPS完整教程》学习笔记42 ——《P43 瞄准(Aiming)》