【MybatisPlus】QueryWrapper、UpdateWrappe、LambdaQueryWrapper、LambdaUpdateWrapper

一、Wrapper简介

QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper 都是 MyBatis-Plus 框架中用于构建条件的工具类,它们之间的关系是继承关系。其中 QueryWrapperUpdateWrapper 是基于普通的对象属性名来构建条件的,而 LambdaQueryWrapperLambdaUpdateWrapper 则是基于 Lambda 表达式来构建条件的。
在这里插入图片描述
下面是AbstractWrapper中的方法
在这里插入图片描述

二、QueryWrapper:

QueryWrapper 是用于构建查询条件的工具类,可以通过链式调用的方式来添加查询条件,例如 equallikein 等条件。它的方法通常以 wrapper.eqwrapper.likewrapper.in 等形式命名。

QueryWrapper 类的方法一般都需要传入实体类的属性名,例如 wrapper.eq("name", "张三") 表示等于条件,wrapper.like("name", "张") 表示模糊查询条件。
示例:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 20).like("name", "张");
List<User> userList = userMapper.selectList(wrapper);

三、UpdateWrapper:

UpdateWrapper 是用于构建更新条件的工具类,可以通过链式调用的方式来添加更新条件,例如 seteqlike 等条件。它的方法通常以 wrapper.setwrapper.eqwrapper.like 等形式命名。

UpdateWrapper 类的方法一般都需要传入实体类的属性名,例如 wrapper.set("age", 30).eq("name", "张三") 表示设置年龄为 30,并且姓名为 “张三” 的记录。
示例:

UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("age", 30).eq("name", "张三");
int rows = userMapper.update(null, wrapper);

四、LambdaQueryWrapper:

LambdaQueryWrapperQueryWrapper 的 Lambda 版本,可以通过 Lambda 表达式来构建查询条件,避免硬编码实体类的属性名。它的方法以 lambda 表达式形式命名,例如lambdaWrapper.eq(User::getName, "张三")。

LambdaQueryWrapper 类的方法使用 Lambda 表达式来指定属性名和条件值,使得代码更加清晰和类型安全。
示例:

LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.eq(User::getAge, 20).like(User::getName, "张");
List<User> userList = userMapper.selectList(lambdaWrapper);

五、LambdaUpdateWrapper:

LambdaUpdateWrapper 是 UpdateWrapper 的 Lambda 版本,用于构建更新条件的工具类,同样可以通过 Lambda 表达式来指定属性名和条件值。

LambdaUpdateWrapper 类的方法使用 Lambda 表达式来指定属性名和条件值,使得代码更加清晰和类型安全。
示例:

LambdaUpdateWrapper<User> lambdaWrapper = new LambdaUpdateWrapper<>();
lambdaWrapper.set(User::getAge, 30).eq(User::getName, "张三");
int rows = userMapper.update(null, lambdaWrapper);

总的来说,QueryWrapper 和 UpdateWrapper 是基于对象属性名构建条件的工具类,而 LambdaQueryWrapper 和 LambdaUpdateWrapper 则是基于 Lambda 表达式构建条件的工具类。Lambda 版本的 Wrapper 在使用时更加类型安全,可以避免硬编码实体类的属性名,使得代码更加清晰和易于维护。

六、应用,注意易错点

  • 问:下面代码是否可以先查询年龄为25的John,再查15岁的john?

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "John");
    queryWrapper.eq("age", 25);
    // 执行查询
    List<User> user1 = userMapper.selectList(queryWrapper);
    queryWrapper.eq("age", 15);
    // 执行查询
    List<User> user2 = userMapper.selectList(queryWrapper);
    
  • 答:在 MyBatis 中,QueryWrapper 类似于 MyBatis-Plus 中的查询条件构造器,它用于构建 SQL 查询条件。

    在上面的代码中,首先创建了一个 QueryWrapper 对象 queryWrapper,然后通过 eq() 方法添加了两个条件:name 字段等于 "John"age 字段等于 25。接着执行了查询操作,将结果存储在 user1 变量中。 然后,修改了 age 条件为等于 15,然后再次执行查询操作,将结果存储在 user2 变量中。

    但是这里存在一个问题:在修改 queryWrapper 条件后,第二次执行查询使用的是修改后的条件,而不是重新构建的条件。因此,第二次执行查询的结果将不是 15 岁的 John,而是与第一次查询结果相同的 25 岁的 John。

  • 要想实现先查询年龄为 25 的 John,然后再查询 15 岁的 John,你需要在第二次查询之前重新构建一个新的 QueryWrapper 对象,并重新设置条件。例如:

    QueryWrapper<User> queryWrapper2 = new QueryWrapper<>();
    queryWrapper2.eq("name", "John").eq("age", 15);
    List<User> user2 = userMapper.selectList(queryWrapper2);
    

    这样就能确保第二次查询使用的是新构建的条件,而不是修改后的条件。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值