前言
为了更方便的实现动态 SQL,Mybatis Plus 在其基础上扩展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了更加简便的查询语法
,同时也避免了 SQL 注入
的风险。
LambdaQueryWrapper 实现了 QueryWrapper
的全部功能,并提供了基于 Lambda
表达式的查询方式,使得查询语法更加优雅。使用 LambdaQueryWrapper,可以方便的实现各种查询条件的拼接,如 where
、and
、or
、in
、like
、between
等条件。
LambdaQueryWrapper 通过函数式编程的方式,提供了多种方法用于实现各种查询条件的拼接
,这些方法包括 eq、ne、gt、ge、lt、le、in、notIn、like、notLike、between、notBetween、isNull、isNotNull 等。
与QueryWrapper对比
LambdaQueryWrapper 和 QueryWrapper 都是 Mybatis Plus 中的查询条件封装类,其中 LambdaQueryWrapper 是基于 Lambda 表达式的实现,而 QueryWrapper 是基于字符串
的实现。它们的优缺点如下:
LambdaQueryWrapper 优点
- 代码简洁,易读易写,使用 Lambda 表达式可
避免手写字符串
的繁琐
和容易出错
; - 类型安全,LambdaQueryWrapper 在
编译期间就能够捕获类型错误
,避免运行时出现类型错误
; - 更加灵活,LambdaQueryWrapper
支持链式调用
,支持多个条件之间的 and 和 or 关系组合,支持子查询等复杂查询操作。
LambdaQueryWrapper 缺点
- LambdaQueryWrapper 基于 Lambda 表达式实现,
可能存在一些性能问题
,在大数据量查询时可能会影响查询性能。
QueryWrapper 优点
- 在少量数据查询时,QueryWrapper 通常比 LambdaQueryWrapper 更快,因为它
不需要解析 Lambda 表达式
; - QueryWrapper 更加灵活,可以使用字符串直接拼接 SQL,
支持 SQL 函数等更多高级查询操作
; - 对于老旧代码,QueryWrapper 更加
适合兼容
和扩展
。
QueryWrapper 缺点
- 代码可读性和可维护性较差,
手写 SQL 字符串容易出错
,并且不易于维护
和修改
; - 使用字符串拼接 SQL,
容易受到 SQL 注入攻击
,需要特别注意防范
; 编译期不能捕获类型错误
,需要在运行时才能发现类型错误。
综上推荐使用 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