• MybatisPlus【SpringBoot】 5 条件构造器和常用接口 5.1 wrapper 介绍 & 5.2 QueryWrapper


    MybatisPlus【SpringBoot】

    【【尚硅谷】2022版MyBatisPlus教程(一套玩转mybatis-plus)】

    5 条件构造器和常用接口

    5.1 wrapper 介绍

    在这里插入图片描述

    • Wrapper : 条件构造抽象类,最顶端父类
      • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
        • QueryWrapper : 查询条件封装
        • UpdateWrapper : Update 条件封装
        • AbstractLambdaWrapper : 使用Lambda 语法
          • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
          • LambdaUpdateWrapper : Lambda 更新封装Wrapper
    5.2 QueryWrapper
    5.2.1 例1:组装查询条件

    查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
    SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)

    //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
    @Test
    public void test01(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("username","a")
                .between("age",20,30)
                .isNotNull("email");
    
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试结果:

    在这里插入图片描述

    在这里插入图片描述

    这是因为数据库中,唯一一条满足条件的记录已经被我们逻辑删除了。

    把第一条数据的逻辑删除手动改成0,再试一次

    在这里插入图片描述

    5.2.2 例2:组装排序条件

    按年龄降序查询用户,如果年龄相同则按id升序排列
    SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC

    //按年龄降序查询用户,如果年龄相同则按id升序排列
    @Test
    public void test02(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("age")
                .orderByAsc("id");
    
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试结果

    在这里插入图片描述

    5.2.3 例3:组装删除条件

    删除email为空的用户
    DELETE FROM t_user WHERE (email IS NULL)【因为我们设置了逻辑删除,所以只是更新操作】

    //删除email为空的用户
    @Test
    public void test03(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("email");
        int result = userMapper.delete(queryWrapper);
        System.out.println("受影响的行数:" + result);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试结果:

    在这里插入图片描述

    5.2.4 例4:条件的优先级

    将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND age > ? OR email IS NULL)

    //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    @Test
    public void test04(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("username","a")
                .gt("age",20)
                .or()
                .isNull("email");
    
        User user = new User();
        user.setAge(18);
        user.setEmail("user@atguigu.com");
        int result = userMapper.update(user,queryWrapper);
        System.out.println("受影响的行数:" + result);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    测试结果:

    在这里插入图片描述

    将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? OR email IS NULL))
    lambda表达式内的逻辑优先运算

    //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    @Test
    public void test05() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("username", "a")
                .and(i -> i.gt("age", 20).or().isNull("email"));
    
        User user = new User();
        user.setAge(18);
        user.setEmail("hah@atguigu.com");
        int result = userMapper.update(user,queryWrapper);
        System.out.println("受影响的行数:" + result);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试结果

    在这里插入图片描述

    OK。

    5.2.5 例5:组装select子句

    查询用户信息的username和age字段
    SELECT username,age FROM t_user

    //查询用户信息的username和age字段
    @Test
    public void test06(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("username","age");
        List<Map<String , Object>> maps = userMapper.selectMaps(queryWrapper);
    
        maps.forEach(System.out::println);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    5.2.6 例6:实现子查询

    查询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))

    //查询id小于等于3的用户信息
    @Test
    public void test07(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    
        queryWrapper.inSql("uid","select uid from t_user where uid <= 3");
        List<User> list = userMapper.selectList(queryWrapper);
    
        list.forEach(System.out::println);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试结果:

    在这里插入图片描述

    OK。

  • 相关阅读:
    VIAVI唯亚威FFL-050/-100 可视故障定位仪
    架构师必须了解的 5 种最佳软件架构模式
    【React】useMemo
    如何使用 Kubernetes Hooks 跟踪容器生命周期
    我在上海吃了3个月方便面,身体会有哪些变化?
    docker 安装redis(最新版)
    Kettle实现对源数据已删除但历史同步到的数据进行打标
    祖传代码如何优化性能?
    Janus: 逆向思维,以数据为中心的MoE训练范式
    MaxKey单点登录认证系统v3.5.10GA发布
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127456889