MyBatis-Plus02_条件构造器QueryWrapper、UpdateWrapper、condition、LambdaQuery

本文详细介绍了MyBatis Plus中的条件构造器,包括QueryWrapper和UpdateWrapper的使用,展示了如何组装查询、排序、删除、更新等条件,以及如何处理可选查询条件,同时提到了Lambda表达式的使用,提高了代码的简洁性和可读性。
摘要由CSDN通过智能技术生成

①. 条件构造器和常用接口

  • ①. wapper介绍
  1. Wrapper : 条件构造抽象类,最顶端父类
  2. AbstractWrapper : 用于查询条件封装,生成sql的where条件
    QueryWrapper : 查询条件封装
    UpdateWrapper : Update 条件封装
    AbstractLambdaWrapper : 使用Lambda语法
  3. LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
    LambdaUpdateWrapper : Lambda 更新封装Wrapper
    在这里插入图片描述
  • ②. 表格为条件构造器使用中的各个方法格式和说明
    在这里插入图片描述

②. 条件构造器 - QueryWrapper

  • ①. 组装查询条件
    查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
@Test
public void test1(){
    //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
    QueryWrapper<User> wrapper=new QueryWrapper<User>();
    wrapper
            .like("name","a")
            .between("age",20,30)
            .isNotNull("email");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::print);
}
  • ②. 组装排序条件
    按年龄降序查询用户,如果年龄相同则按id升序排列
@Test 
public void test02(){
    //按年龄降序查询用户,如果年龄相同则按id升序排列
    QueryWrapper<User> wrapper=new QueryWrapper<User>();
    wrapper.orderByDesc("age").orderByAsc("id");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::print);
}
  • ③. 组装删除条件
    删除email为空的用户
@Test
public void  test3(){
    //删除email为空的用户
    // DELETE FROM t_user WHERE (email IS NULL)
    QueryWrapper<User>wrapper=new QueryWrapper<>();
    wrapper.isNull("email");
    int result = userMapper.delete(wrapper);
    System.out.println(result);
}
  • ④. 条件的优先级
    将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
@Test
public void test4(){
    //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    // UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND age > ? OR email IS NULL)
    QueryWrapper<User>wrapper=new QueryWrapper<>();
    wrapper
            .like("name","a")
            .gt("age",20)
            .or()
            .isNull("email");
    User user=new User();
    user.setEmail("845195485@qq.com");
    user.setAge(27);
    int result = userMapper.update(user, wrapper);
    System.out.println("result = " + result);
}

@Test
public void test5(){
    //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    //UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? OR email IS NULL))
    // lambda表达式内的逻辑优先运算
    QueryWrapper<User>wrapper=new QueryWrapper<>();
    wrapper
            .like("name","a")
            .and((user)->user.gt("age",20).or().isNull("email"));
    User user=new User();
    user.setEmail("128287979@qq.com");
    user.setAge(26);
    int result = userMapper.update(user, wrapper);
    System.out.println("result = " + result);
}
  • ⑤. 组装select子句
    查询指定的字段
@Test
public void test6(){
    //查询用户信息的username和age字段
    //SELECT username,age FROM t_user
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为null
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}
  • ⑥. 如何实现子查询
@Test 
public void test06() {
    //这里只是演示,知道子查询应该如何写,实际这个SQL没有任何的意义
    //查询id小于等于3的用户信息
    // SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (id IN (select id from t_user where id <= 3))
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from t_user where id <= 3");
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

③. 条件构造器 - UpdateWrapper

    @Test
    public  void test8(){
        //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        //UPDATE t_user SET name=? WHERE is_delete=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
        UpdateWrapper<User>updateWrapper=new UpdateWrapper<>();
        updateWrapper
                .like("name","a")
                .and(item->item.gt("age",20).or().isNull("email"));
        updateWrapper.set("name","TANG_updataWrapper");
        int result = userMapper.update(null, updateWrapper);
        System.out.println("result = " + result);
    }

④. 简化代码开发 - condition

  • ①. 在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果
    @Test
    public void test9(){
        //定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        if (StringUtils.isNotBlank(username)){
            //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
            queryWrapper.like("name",username);
        }
        if(ageBegin!=null){
            queryWrapper.ge("age", ageBegin);
        }
        if(ageBegin!=null){
            queryWrapper.lt("age",ageEnd);
        }
        userMapper.selectList(queryWrapper).forEach(System.out::print);
    }
  • ②. 上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写
    @Test
    public void test10(){
        //定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .like(StringUtils.isNotBlank(username),"name",username)
                .ge(ageBegin!=null,"age",ageBegin)
                .le(ageEnd!=null,"age",ageEnd);
        userMapper.selectList(queryWrapper).forEach(System.out::print);
    }

⑤. LambdaQuery、updateWrapper

  • ①. 避免使用字符串表示字段,防止运行时错误
    @Test public void test11() {
        //定义查询条件,有可能为null(用户未输入)
        String username = "a";
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        //避免使用字符串表示字段,防止运行时错误
        queryWrapper
                .like(StringUtils.isNotBlank(username), User::getName, username)
                .ge(ageBegin != null, User::getAge, ageBegin)
                .le(ageEnd != null, User::getAge, ageEnd);
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

    @Test
    public void test12(){
        //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        //UPDATE t_user SET name=? WHERE is_delete=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
        LambdaUpdateWrapper<User>lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper
                .like(User::getName,"TANG_updataWrapper")
                .and(item->item.gt(User::getAge,20).or().isNull(User::getEmail));
        lambdaUpdateWrapper.set(User::getName,"LambdaUpdateWrapper");
        int result = userMapper.update(null, lambdaUpdateWrapper);
        System.out.println("result = " + result);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所得皆惊喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值