您的位置:

深入浅出Mybatis Plus QueryWrapper

一、创建QueryWrapper对象

QueryWrapper是Mybatis Plus提供的一个查询条件构造器,通过它可以灵活的构造相应的查询条件来实现复杂查询的功能。创建一个QueryWrapper的方式很简单,只需要调用静态方法QueryWrapper()即可:

QueryWrapper queryWrapper = new QueryWrapper<>();

  

其中,User是要查询的实体类,通过泛型的方式来指定。创建好QueryWrapper对象之后,就可以开始按照自己的需求添加各种查询条件了。

二、添加查询条件

QueryWrapper提供了丰富的方法来添加各种查询条件,这里介绍几种常用的方法。

1、eq方法

eq方法用来添加等于条件,例如:

queryWrapper.eq("name", "Jack");

表示查询name等于"Jack"的记录。

2、like方法

like方法用来添加模糊查询条件,例如:

queryWrapper.like("name", "Jac");

表示查询name包含"Jac"的记录。

3、between方法

between方法用来添加区间查询条件,例如:

queryWrapper.between("age", 18, 30);

表示查询age在18到30之间的记录。

4、in方法

in方法用来添加in查询条件,例如:

queryWrapper.in("id", 1, 3, 5);

表示查询id为1或3或5的记录。

5、isNull和isNotNull方法

isNull和isNotNull方法用来添加空值查询条件,例如:

queryWrapper.isNull("email");

表示查询email为空的记录。

6、orderBy方法

orderBy方法用来添加排序条件,例如:

queryWrapper.orderBy(true, true, "age");

表示按照age升序排序。

三、链式查询

Mybatis Plus的QueryWrapper支持链式查询,也就是在一个QueryWrapper对象上不断添加多个查询条件,例如:

queryWrapper.eq("name", "Jack")
            .like("email", "@test.com")
            .between("age", 18, 30)
            .orderBy(true, true, "age");

表示查询name为"Jack",email包含"@test.com",age在18到30之间的记录,并且按照age升序排序。

四、Lambda查询

Mybatis Plus还提供了一种更加简洁的查询方式,即通过Lambda表达式来构造查询条件。Lambda表达式可以用来指定查询实体中某些字段的值,例如:

LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper
   ()
                .eq(User::getName, "Jack")
                .like(User::getEmail, "@test.com")
                .between(User::getAge, 18, 30)
                .orderBy(true, true, User::getAge);

   
  

表示查询name为"Jack",email包含"@test.com",age在18到30之间的记录,并且按照age升序排序。通过Lambda表达式,我们可以直接指定实体类中的属性,不需要再通过字符串来指定字段名,避免了因为拼写错误等问题而导致的查询失败。

五、高级查询

1、查询中使用子查询

在QueryWrapper中也可以使用子查询来实现更加复杂的查询。例如,我们可以通过下面的方式来查询user_id在一个子查询中查出的记录:

QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("user_id", "select id from user where age < 20");

  

其中,inSql方法用来添加一个IN语句,需要传入一个子查询的SQL语句。

2、查询结果映射到Dto

有时候,我们想要将查询结果映射到一个自定义的Dto对象中,可以通过以下方式实现:

QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
        .eq(User::getName, "Jack")
        .select(User::getName, User::getEmail, User::getAge)
        .last("limit 1");

List
    userDtoList = userMapper.selectObjs(queryWrapper).stream()
        .map(obj -> BeanUtil.toBean(obj, UserDto.class))
        .collect(Collectors.toList());

   
  

其中,select方法用来指定需要查询的字段,last方法用来添加where语句之后的部分,这里是添加limit 1。最后通过selectObjs方法查询出结果后,将每一个结果对象转换成Dto对象。

六、总结

至此,我们对Mybatis Plus中的QueryWrapper做了一个全面的介绍,包括创建对象、添加查询条件、链式查询、Lambda查询、高级查询等方面。QueryWrapper可以帮助我们灵活构造相应的查询条件,在查询数据时提高我们的效率和准确性。