MyBatis-Plus条件构造器和常用接口

一、warpper条件构造器关系介绍

Wrapper : 条件构造抽象类,是最上层的父类

  • AbstractWrapper : 作用是进行查询条件封装,生成 sql 的 where 筛选条件
  1. QueryWrapper : Entity(枚举) 对象封装操作类,不是用lambda语法
  2. UpdateWrapper : Update 条件封装,用于Entity对象更新操作
  3. AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
    • LambdaQueryWrapper :  用于Lambda语法使用的查询Wrapper
    • LambdaUpdateWrapper : Lambda 更新封装的Wrapper

二、常见方法说明

具体用法参考:https://baomidou.com/pages/10c804/

2.1.QueryWrapper

组装查询条件

//组装查询条件
    @Test
    public void testQueryWrapper01(){
        //查询用户名包含 王,年龄介于25到40岁直接,邮箱不为空的用户信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();

        /**
         * 设置查询条件
         * 执行的SQL
         * SELECT uid AS id,user_name AS name,age,email,is_delete FROM t_user WHERE is_delete=0 AND
           (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
         *
         * */
        userQueryWrapper.like("user_name", "王")
                .between("age", 25, 40)
                .isNotNull("email");

        List<User> users = userMapper.selectList(userQueryWrapper);
        users.forEach(System.out::println);
    }

组装排序条件

//排序条件查询
    @Test
    public void testQueryWrapper02(){
        //按照年龄降序查询用户信息,年龄相同则按照id升序排列
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();

        //设置查询条件
        userQueryWrapper.orderByDesc("age").orderByAsc("uid");

        //查询
        List<User> users = userMapper.selectList(userQueryWrapper);
        users.forEach(System.out::println);
    }

组装删除条件

//组装删除条件
    @Test
    public void testQueryWrapper03(){
        //删除email为空的用户
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();

        //设置条件
        userQueryWrapper.isNull("email");

        //删除
        int result = userMapper.delete(userQueryWrapper);

        System.out.println("受到影响的行数:"+result);
    }

条件的优先级

//条件优先级
    @Test
    public void testQueryWrapper04(){
        //查询 年龄大于25 用户名中包含有 m, 或者邮箱为Null的用户信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        //设置条件
        userQueryWrapper.like("user_name","m")
                .gt("age",20)
                .or()
                .isNull("email");

        //设置修改的用户字段信息
        // UPDATE t_user SET age=?, email=? WHERE is_delete=0 AND (user_name LIKE ? AND age > ? OR email IS NULL)
        User user = new User();
        user.setAge(10);
        user.setEmail("hello@163.com");

        //设置查询
        int result = userMapper.update(user, userQueryWrapper);

        System.out.println("受影响的行数:"+result);
    }

    @Test
    public void testQueryWrapper05(){
        // 把用户名中包含有a 并且 (年龄大于20或者邮箱为null) 的用户信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        //设置条件
        userQueryWrapper.like("user_name","a")
                .and(i->i.gt("age",20).or().isNull("email"));

        //设置修改的用户字段信息
        // UPDATE t_user SET age=?, email=? WHERE is_delete=0 AND (user_name LIKE ? AND age > ? OR email IS NULL)
        User user = new User();
        user.setAge(10);
        user.setEmail("hello@163.com");

        //设置查询
        int result = userMapper.update(user, userQueryWrapper);

        System.out.println("受影响的行数:"+result);
    }

组装select子句

 //组装select子句
    @Test
    public void testQueryWrapper06(){
        //查询用户信息的user_name和age字段
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();

        //设置查询输出的字段
        userQueryWrapper.select("user_name","age");

        //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值 为null
        List<Map<String, Object>> maps = userMapper.selectMaps(userQueryWrapper);

        maps.forEach(System.out::println);

    }

实现子查询

 //实现子查询
    @Test
    public void testQueryWrapper07(){
        //查询年龄小于等于18的用户信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();

        //设置子查询
        // userQueryWrapper.inSql("uid","select uid from t_user where age<= 18");
        userQueryWrapper.inSql("uid","select uid from t_user where age<= 18");

        //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值 为null
        List<User> users = userMapper.selectList(userQueryWrapper);

        users.forEach(System.out::println);
    }

2.2.UpdateWrapper

@Test
    public void testUpDateWrapper(){
        //将 (年龄大于30或者邮箱为null)并且用户名中包含有王 字的用户信息进行修改
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        //组装set子句和修改条件
        userUpdateWrapper.set("age",8).set("email","wuji@163.com")
                .like("user_name","王")
                .and(i->i.gt("age",25).or().isNull("email"));

        //执行修改 这里就不需要创建user对象了
        int result = userMapper.update(null, userUpdateWrapper);

        System.out.println("受影响的行数:"+result);
    }

2.3.condition

在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果
@Test
    public void testCondition(){
        //定义查询条件,有时候页面的字段有可能不输入传输到后端为null,这时候就不用组装该字段
        String user_name = null;
        Integer ageBegin = 25;
        Integer ageEnd = 40;

        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        //StringUtils.isNotBlank(user_name)判断某个字符串是否不为空并且长度不为0没有空白字符
        userQueryWrapper.like(StringUtils.isNotBlank(user_name),"user_name", "王")
                .ge(ageBegin != null,"age",ageBegin)
                .le(ageEnd != null,"age",ageEnd);

        //查询数据
        List<User> users = userMapper.selectList(userQueryWrapper);
        users.forEach(System.out::println);
    }

2.4.LambdaQueryWrapper

 @Test
    public void testQueryWrapper10(){
        //定义查询条件,有时候页面的字段有可能不输入传输到后端为null,这时候就不用组装该字段
        String user_name = "莎";
        Integer ageBegin = 25;
        Integer ageEnd = 40;

        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();

        //判断如果为空,则不组装
        userLambdaQueryWrapper.like(StringUtils.isNotBlank(user_name),User::getName, user_name)
                .ge(ageBegin != null,User::getAge,ageBegin)
                .le(ageEnd != null,User::getAge, ageEnd);

        List<User> users = userMapper.selectList(userLambdaQueryWrapper);
        users.forEach(System.out::println);

    }

2.5.LambdaUpdateWrapper

@Test
    public void testQueryWrapper11(){
        //组装set子句
        LambdaUpdateWrapper<User> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();

        userLambdaUpdateWrapper.set(User::getAge,37)
                .set(User::getEmail,"hello@126.com")
                .like(User::getName,"莎")
                .and(i->i.gt(User::getAge,35).or().isNull(User::getEmail));

        int result = userMapper.update(null, userLambdaUpdateWrapper);
        System.out.println("受影响的行数:"+result);
    }
posted @ 2022-12-02 11:43  酒剑仙*  阅读(262)  评论(0)    收藏  举报