简单学懂LambdaQueryWrapper

一句话定义

通过调用构造方法返回一个LambdaQueryWrapper对象,在对象上使用链式编程
、Lambda表达式和链式调用的方式,灵活地实现了SQL查询条件构造和简化了SQL查询代码的编写。

一个流程看懂

创建一个LambdaQueryWrapper对象 -> 使用Lambda表达式或方法引用构造查询条件 -> 调用MyBatis-Plus提供的方法获取查询结果。

盐焗小宇宙

用法

首先,我们定义了一个UserDao接口集成自BaseMapper<User>,它提供了许多基础的CRUD方法。

public interface UserDao extends BaseMapper<User> {
}

然后,定义了一个示例Service类UserService,它使用了@Autowired注解注入了UserDao对象,用于操作数据库。

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public List<User> listUsersByGender(String gender) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getGender, gender).orderByDesc(User::getCreateTime);
        
        /**
          *LambdaQueryWrapper常用方法
          */
         wrapper.eq("实体类::查询字段", "条件值"); //相当于where条件
         wrapper.between("实体类::查询字段", "区间一", "区间二");//相当于范围内使用的between
         wrapper.like("实体类::查询字段", "模糊查询的字符"); //模糊查询like
         wrapper.groupBy("实体类::查询字段");  //相当于group by分组
         wrapper.in("实体类::查询字段", "包括的值,分割"); //相当于in
         wrapper.orderByAsc("实体类::查询字段"); //升序
         wrapper.orderByDesc("实体类::查询字段");//降序
         wrapper.ge("实体类::查询字段", "要比较的值"); //大于等于
         wrapper.le("实体类::查询字段", "要比较的值"); //小于等于
        
        return userDao.selectList(wrapper);
    }
}

上面的代码展示了通过LambdaQueryWrapper进行查询的基本步骤。

  1. 首先,我们定义了一个UserDao接口集成自BaseMapper<User>,它提供了许多基础的CRUD方法。

    CRUD方法:指封装了数据库语句的增删改查方法。

  2. 然后定义了一个示例Service类UserService,它使用了@Autowired注解注入了UserDao对象,用于操作数据库。

  3. UserService类的listUsersByGender方法中,我们首先创建了一个LambdaQueryWrapper<User>对象,它用于构造查询条件。

  4. 然后,我们使用eq方法添加查询条件,该方法使用Lambda表达式指定了查询对象的属性以及需要查询的值。接下来,我们使用orderByDesc方法通过Lambda表达式指定了查询结果的排序方式。最后,我们使用selectList方法获取符合条件的查询结果。

  5. 在实际使用中,我们可以根据需要在LambdaQueryWrapper对象中使用更多的方法来构建查询条件。在Lambda表达式中,我们可以通过::符号指定查询对象的属性。orderby、select等方法可用于指定查询结果的排序方式和返回的列等。

  6. 需要注意的是,为了确保MySQL和Java类的字段名称一致,我们需要在MySQL中将列名和Java Bean属性名定义一致。这样,在查询数据时,MyBatis-Plus就会自动映射数据库表和Java Bean对象的属性,使我们能够更方便地进行数据操作。

Q&A

Q1:LambdaQueryWrapper返回的查询结果是什么类型?

A1:LambdaQueryWrapper返回的查询结果通常是由 MyBatis-Plus 提供的IBaseMapper中的方法返回的类型。(IBaseMapper是一个基础的Mapper接口, 提供了很多基础的CRUD操作,如insert、update、delete、select等。)查询结果的类型通常是一个Java Bean对象或一组Java Bean对象的集合,它们由IBaseMapper中的方法返回并由MyBatis进行映射。 例如,当使用selectList方法查询时,返回的是一个泛型为Java Bean的List集合;当使用selectOne查询时,返回一个Java Bean对象。

Q2:LambdaQueryWrapper和QueryWrapper有什么主要区别?

A2:

  • LambdaQueryWrapper和QueryWrapper都是MyBatis-Plus框架中提供的查询条件构造器,它们的主要区别在于:使用Lambda表达式和方法引用构造查询条件、类型安全(有编译时校验)和代码简洁方便。
  • 具体来说,LambdaQueryWrapper支持使用Lambda表达式和方法引用构建查询条件,它需要使用IDEA等编辑工具来支持Lambda表达式,需要jdk1.8及以上的版本支持。 而QueryWrapper则使用拼接字符串的方式来构造查询条件,它的使用方法与JdbcTemplate等框架非常相似。
  • 在使用LambdaQueryWrapper时,代码更加类型安全,因为使用了Lambda表达式的编译时校验,可以避免一些由于类型不匹配或写错列名等问题导致的运行时异常。此外,使用LambdaQueryWrapper时,代码更加简洁和易读,可以大大提高开发效率。
  • 总的来说,如果你是使用jdk1.8及以上版本和IDEA等编辑工具进行开发,推荐使用LambdaQueryWrapper,否则使用QueryWrapper。但需要注意的是,如果你需要用到某些QueryWrapper特有的方法,建议还是使用QueryWrapper。

写在最后

如果文中有什么问题和错误的话,欢迎斧正。

参考以下内容,如有侵权,请联系作者删除
Mybatis-Plus高级之LambdaQueryWrapper,Wrappers.<实体类>lambdaQuery的使用