MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery相关的知识,希望对你有一定的参考价值。

文章目录

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

  • ①. 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);
    

以上是关于MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-plus条件构造器详解

mybatis-plus条件构造器EntityWrapper

Mybatis-Plus 条件构造器

mybatis-plus条件构造器

mybatis-plus条件构造器

mybatis-plus条件构造器QueryWrapper