# QueryWrapper
QueryWrapper是MyBatis-Plus最基础的查询条件构造器之一。它通过链式调用的方式构建查询条件,并使用普通的字符串作为字段名、操作符和值。使用方式类似于传统的SQL查询。
# LambdaQueryWrapper
LambdaQueryWrapper是在QueryWrapper的基础上增加了Lambda表达式的功能,使得构建查询条件更加类型安全、易读,并且能够在编译时进行语法校验。它通过方法引用的方式来指定实体类的属性,并提供了丰富的方法来构建查询条件。
# 具体实践:
public class User {
private Long id;
private String name;
private Integer age;
private LocalDateTime createTime;
// 其他字段...
// 省略 getter 和 setter 方法
}
2
3
4
5
6
7
8
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25)
.like("name", "John")
.orderByDesc("create_time")
.last("limit 10");
List<User> userList = userMapper.selectList(queryWrapper);
2
3
4
5
6
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge, 25)
.like(User::getName, "John")
.orderByDesc(User::getCreateTime)
.last("limit 10");
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
2
3
4
5
6
# 区别差异:
# 1.使用方式:
**LambdaQueryWrapper:**使用lambda表达式的方式构建查询条件
QueryWrapper:使用链式调用的方式构建查询条件
# 2.列名匹配:
QueryWrapper:列名匹配使用的是数据库中的字段名。
LambdaQueryWrapper:使用的是Lambda语法,偏向于对象
# 3.优点:
LambdaQueryWrapper:写实体属性,而不是数据库字段,这样数据库字段改了只需要修改对应的XML配置文件即可,而不需要修改Java中的代码。此外,如果你的查询条件相对简单且你更注重与代码的清晰性和类型安全性,可以优先考虑使用LambdaQueryWrapper.。
QueryWrapper:适合复杂的查询条件,特别是涉及到复杂的SQL片段拼接等情况。
# 4.缺点
LambdaQueryWrapper使用了Lambda表达式,可能会增加一定的学习成本。
QueryWrapper则是采用链式调用的方式可能在某些情况下导致代码过于冗长。
# 5.环境适用性
两者都可以用于大多数开发环境和场景,但选择哪一个取决于具体的项目需求和个人偏好。同事由于Lamda表达式的特性,使用LambdaQueryWrapper 的时候要注意支持的JDK版本在1.8及以上。
# 争议点:
# 关于性能的问题:
LambdaQueryWrapper:由于LambdaQueryWrapper使用了缓存机制,避免了每次构造条件都要解析Lambda表达式的开销。
*特别注意:
在基于百度文心一言3.5模型、星火AI大模型给予的答案中:
LambdaQueryWrapper基于Lambda表达式实现,可能存在一些性能问题,在大数据量查询时可能会影响查询性能。而QueryWrapper相对较为成熟,性能方面相对较好。
在基于ChatGPT3.5模型的Monica给予的答案中:
在性能方面,LambdaQueryWrapper和QueryWrapper的差异主要体现在以下几个方面,尤其在处理大量数据的情况下:
- 1编译时检查:LambdaQueryWrapper在编译时可以进行一些静态检查,能够提前发现一些错误。而QueryWrapper只能在运行时才能发现错误。
- 表达方式:LambdaQueryWrapper使用Lambda表达式来构建查询条件,而QueryWrapper使用普通的方法链来构建查询条件。Lambda表达式在代码可读性方面更加直观,但在性能方面可能略逊一筹。
- 内存消耗:LambdaQueryWrapper在创建查询条件时会创建一些中间对象,可能会占用更多的内存。而QueryWrapper则不会创建这些中间对象,可能在处理大量数据时更加节省内存。
- 执行效率:由于LambdaQueryWrapper使用了Lambda表达式,可能会引入一些额外的性能开销。而QueryWrapper则直接使用方法链,可能在处理大量数据时更加高效。