文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Java】Mybatis Plus LambdaQueryWrapper梳理

2023-08-30 17:21

关注

前言

为了更方便的实现动态 SQL,Mybatis Plus 在其基础上扩展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了更加简便的查询语法,同时也避免了 SQL 注入的风险。

LambdaQueryWrapper 实现了 QueryWrapper 的全部功能,并提供了基于 Lambda 表达式的查询方式,使得查询语法更加优雅。使用 LambdaQueryWrapper,可以方便的实现各种查询条件的拼接,如 whereandorinlikebetween 等条件。

LambdaQueryWrapper 通过函数式编程的方式,提供了多种方法用于实现各种查询条件的拼接,这些方法包括 eq、ne、gt、ge、lt、le、in、notIn、like、notLike、between、notBetween、isNull、isNotNull 等。

与QueryWrapper对比

LambdaQueryWrapper 和 QueryWrapper 都是 Mybatis Plus 中的查询条件封装类,其中 LambdaQueryWrapper 是基于 Lambda 表达式的实现,而 QueryWrapper 是基于字符串的实现。它们的优缺点如下:

LambdaQueryWrapper 优点

  1. 代码简洁,易读易写,使用 Lambda 表达式可避免手写字符串繁琐容易出错
  2. 类型安全,LambdaQueryWrapper 在编译期间就能够捕获类型错误避免运行时出现类型错误
  3. 更加灵活,LambdaQueryWrapper 支持链式调用,支持多个条件之间的 and 和 or 关系组合,支持子查询等复杂查询操作。

LambdaQueryWrapper 缺点

  1. LambdaQueryWrapper 基于 Lambda 表达式实现,可能存在一些性能问题,在大数据量查询时可能会影响查询性能。

QueryWrapper 优点

  1. 在少量数据查询时,QueryWrapper 通常比 LambdaQueryWrapper 更快,因为它不需要解析 Lambda 表达式
  2. QueryWrapper 更加灵活,可以使用字符串直接拼接 SQL,支持 SQL 函数等更多高级查询操作
  3. 对于老旧代码,QueryWrapper 更加适合兼容扩展

QueryWrapper 缺点

  1. 代码可读性和可维护性较差,手写 SQL 字符串容易出错,并且不易于维护修改
  2. 使用字符串拼接 SQL,容易受到 SQL 注入攻击需要特别注意防范
  3. 编译期不能捕获类型错误,需要在运行时才能发现类型错误。

综上推荐使用 LambdaQueryWrapper(此外,LambdaQueryWrapper 还具有良好的兼容性和扩展性,可以轻松适应不同的业务需求,提高开发效率和代码质量)。

案例

简单查询

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUsername, "张三")        .and(w -> w.between(User::getAge, 18, 30)                .or().eq(User::getGender, 1))        .orderByDesc(User::getCreateTime);List<User> userList = userMapper.selectList(wrapper);

首先创建了一个 LambdaQueryWrapper 对象,然后通过 eq 方法添加一个等于条件,表示查询用户名为“张三”的用户。接着,使用 and 方法添加一个条件组,该组包含了一个 between 条件和一个 or 条件,分别表示查询年龄在 18 到 30 之间的用户,或者查询性别为 1 的用户。注意,条件组中的多个条件之间默认是 and 的关系,可以通过 or 方法切换为 or 的关系。最后,使用 orderByDesc 方法对查询结果进行排序,按照创建时间倒序排列。

使用 LambdaQueryWrapper 进行查询时,还可以通过 select 方法来自定义查询字段,从而实现对查询结果的灵活控制。

select

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getAge, 20)        .select(User::getId, User::getUserName, User::getAge);List<User> userList = userMapper.selectList(wrapper);

首先通过 LambdaQueryWrapper 对象创建了一个查询条件,然后使用 eq 方法添加了一个等于条件,表示查询年龄为 20 的用户。接着,通过 select 方法来自定义查询字段,只查询 id、username、age 三个字段,这些字段是以逗号分隔的字符串形式传入的。最后,调用 selectList 方法执行查询操作,得到查询结果。

来源地址:https://blog.csdn.net/weixin_43874301/article/details/129612189

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯