# 3.MyBatis-Plus-条件构造器

# 1.wrapper介绍

Wrapper : 条件构造抽象类,最顶端父类

AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件         QueryWrapper : 查询条件封装         UpdateWrapper : Update 条件封装         AbstractLambdaWrapper : 使用Lambda 语法             LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper             LambdaUpdateWrapper : Lambda 更新封装Wrapper

# 2.QueryWrapper

例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)

    @Test
    public void test1(){

        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("user_name","a")
                .between("age",20,30)
                .isNotNull("email");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
1
2
3
4
5
6
7
8
9
10

例2:组装排序条件

按年龄降序查询用户,如果年龄相同则按id升序排列

SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC

    @Test
    public void test2(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("age")
                .orderByAsc("id");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
1
2
3
4
5
6
7
8

例3:组装删除条件

删除email为空的用户

DELETE FROM t_user WHERE (email IS NULL)

    @Test
    public void test3(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.isNull("email");
        userMapper.delete(wrapper);
    }
1
2
3
4
5
6

例4:组装更新条件

将(年龄大于20并且用户名称包含"a")或邮箱为null的用户信息修改

UPDATE t_user SET user_name=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)

    @Test
    public void test4(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.gt("age",20).
                like("user_name","a").
                or().isNull("email");
        User user = new User();
        user.setName("lala");
        userMapper.update(user,wrapper);
    }
1
2
3
4
5
6
7
8
9
10

例5:条件优先级

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

    @Test
    public void test5(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("user_name","a")
                .and(i->i.gt("age",20).isNull("email"));
        User user = new User();
        user.setName("小明");
        userMapper.update(user,wrapper);
    }
1
2
3
4
5
6
7
8
9

and里用的是Consumer,Param参数相当于Wrapper的子类,可调用Wrapper中的方法


例5:组装select子句

查询用户信息的name和age字段

SELECT user_name,age FROM t_user WHERE is_deleted=0

    @Test
    public void test6(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.select("user_name","age");
        userMapper.selectMaps(wrapper).forEach(System.out::println);
    }
1
2
3
4
5
6

例6:实现子查询

查询id小于等于3的用户信息

SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid<=3))

@Test
    public void test7(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.inSql("uid","select uid from t_user where uid<=3");
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
1
2
3
4
5
6

# 3.UpdateWrapper

将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改

UPDATE t_user SET user_name=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? AND email IS NULL))

@Test  
public void test8(){  
     UpdateWrapper<User> wrapper = new UpdateWrapper<>();  
     wrapper.like("user_name","小")  
             .and(i->i.gt("age",20).isNull("email"));  
     wrapper.set("user_name","小王");  
     userMapper.update(null,wrapper);  
}
1
2
3
4
5
6
7
8

# 4.condition

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

思路一:

    @Test
    public void test9(){
        //定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //判断字符串不为空串,长度不为0,不为null
        if(StringUtils.isNotBlank(username)){
            wrapper.like("user_name",username);
        }
        if (ageBegin != null){
            wrapper.ge("age",ageBegin);
        }
        if (ageEnd != null){
            wrapper.le("age",ageEnd);
        }
        userMapper.selectList(wrapper).forEach(System.out::println);

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

思路二:

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

    @Test
    public void test10(){
        //定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(username),"user_name",username).
               ge(ageBegin != null,"age",ageBegin).
               le(ageEnd != null,"age",ageEnd);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
1
2
3
4
5
6
7
8
9
10
11
12

# 5.LambdaQueryWrapper

其实就是为了防止我们把字段名写错。

    @Test
    public void test11(){
        //定义查询条件,有可能为null(用户未输入或未选择)
        String username = null;
        Integer ageBegin = 10;
        Integer ageEnd = 24;
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(username),User::getName,username).
               ge(ageBegin != null,User::getAge,ageBegin).
               le(ageEnd != null,User::getAge,ageEnd);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
1
2
3
4
5
6
7
8
9
10
11
12

# 6.LambdaUpdateWrapper

@Test
public void test10() {
    //组装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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

最近更新: 9/19/2026, 1:27:08 PM
编程NOTE   |