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

一、wapper 介绍

        1、Wrapper 是条件构造抽象类,最顶端父类。

        2、AbstractWrapper 是用于查询条件封装,生成 sql where 条件

        3、QueryWrapper 是查询条件封装的具体实现类

        4、UpdateWrapper Update 条件封装的具体实现类

        5、AbstractLambdaWrapper 是使用 Lambda 语法的抽象类

        6、LambdaQueryWrapper 是基于 Lambda 语法使用的查询 Wrapper 的实现类

        7、LambdaUpdateWrapper 是基于 Lambda 语法更新封装 Wrapper 的实现类。

二、QueryWrapper 示例

2.1 组装查询条件

    @Test
    public void test01(){
        // 查询用户名包含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)
        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);
    }

2.2 组装排序条件

    @Test
    public void test02(){
        // 按年龄降序查询用户,如果年龄相同则按id升序排列
        // SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .orderByDesc("age")
                .orderByAsc("id");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

2.3 组装删除条件

    @Test
    public void test03(){
        // 删除 email 为空的用户
        // DELETE FROM t_user WHERE (email IS NULL)
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("email");
        // 条件构造器也可以构建删除语句的条件
        int result = userMapper.delete(queryWrapper);
        System.out.println("受影响的行数:" + result);
    }

2.4 条件的优先级

    @Test
    public void test04() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
        // UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND age > ? OR email IS NULL)
        queryWrapper
                .like("username", "a")
                .gt("age", 20)
                .or()
                .isNull("email");
        User user = new User();
        user.setAge(18);
        user.setEmail("user@atguigu.com");
        // user 参数封装更新后的数据,queryWrapper 参数封装更新的条件
        int result = userMapper.update(user, queryWrapper);
        System.out.println("受影响的行数:" + result);
    }
    @Test
    public void test05() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
        // UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? OR email IS NULL))
        // lambda 表达式内的逻辑优先运算
        queryWrapper.like("username", "a")
                .and(i -> i.gt("age", 20).or().isNull("email"));
        
        User user = new User();
        user.setAge(18);
        user.setEmail("user@atguigu.com");
        // user 参数封装更新后的数据,queryWrapper 参数封装更新的条件
        int result = userMapper.update(user, queryWrapper);
        System.out.println("受影响的行数:" + result);
    }

2.5 组装 select 子句

        查询自己指定的字段,如下

    @Test
    public void test06() {
        // 查询用户信息的 username 和 age 字段
        // SELECT username,age FROM t_user
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("username", "age");
        // selectMaps() 返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为null
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        maps.forEach(System.out::println);
    }

2.6 实现子查询

    @Test
    public void test07() {
        // 查询 id 小于等于3的用户信息
        // SELECT uid AS id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 3))
        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);
    }

三、UpdateWrapper 示例

3.1 更新

    @Test
    public void test08() {
        // 将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
        // 组装set子句以及修改条件
        // UPDATE t_user SET age=?,email=? WHERE is_deleted=0 AND (username LIKE ? AND (age > ? OR email IS NULL))
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        // lambda表达式内的逻辑优先运算
        updateWrapper
                .set("age", 18)
                .set("email", "user@atguigu.com")
                .like("username", "a")
                .and(i -> i.gt("age", 20).or().isNull("email"));
        int result = userMapper.update(null, updateWrapper);
        System.out.println(result);
    }

四、condition

        在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响 SQL 执行的结果。

4.1 方式一

    @Test
    public void test09() {
        // 定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(username)){
            queryWrapper.like("username","a");
        }
        if(ageBegin != null){
            queryWrapper.ge("age", ageBegin);
        }
        if(ageEnd != null){
            queryWrapper.le("age", ageEnd);
        }
        // SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >=? AND age <= ?)
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

4.2 方式二

        上面的实现方案没有问题,但是代码比较复杂,我们可以使用带 condition 参数的重载方法构建查询条件,简化代码的编写,如下:

    @Test
    public void test09UseCondition() {
        // 定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .like(StringUtils.isNotBlank(username), "username", "a")
                .ge(ageBegin != null, "age", ageBegin)
                .le(ageEnd != null, "age", ageEnd);
        // SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >=? AND age <= ?)
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(System.out::println);
    }

五、LambdaQueryWrapper

        防止用户手动的输入字段名称写错,当查询时可以使用 lambda 表达式,如下:

    @Test
    public void test10() {
        // 定义查询条件,有可能为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);
    }

六、LambdaUpdateWrapper

        防止用户手动的输入字段名称写错,当更新时可以使用 lambda 表达式,如下:

    @Test
    public void test11() {
        // 组装set子句
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper
                .set(User::getAge, 18)
                .set(User::getEmail, "user@atguigu.com")
                .like(User::getName, "a")
                .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail)); // lambda表达式内的逻辑优先运算
        User user = new User();
        int result = userMapper.update(user, updateWrapper);
        System.out.println("受影响的行数:" + result);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

快乐的小三菊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值