【Java】Mybatis-Plus LambdaQueryWrapper梳理

3,966 阅读3分钟

【Java】Mybatis-Plus LambdaQueryWrapper梳理

前言

为了更方便的实现动态 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 方法执行查询操作,得到查询结果。