简单学懂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进行查询的基本步骤。
-
首先,我们定义了一个
UserDao
接口集成自BaseMapper<User>
,它提供了许多基础的CRUD方法。CRUD方法:指封装了数据库语句的增删改查方法。
-
然后定义了一个示例Service类
UserService
,它使用了@Autowired
注解注入了UserDao
对象,用于操作数据库。 -
在
UserService
类的listUsersByGender
方法中,我们首先创建了一个LambdaQueryWrapper<User>
对象,它用于构造查询条件。 -
然后,我们使用
eq
方法添加查询条件,该方法使用Lambda表达式指定了查询对象的属性以及需要查询的值。接下来,我们使用orderByDesc
方法通过Lambda表达式指定了查询结果的排序方式。最后,我们使用selectList
方法获取符合条件的查询结果。 -
在实际使用中,我们可以根据需要在LambdaQueryWrapper对象中使用更多的方法来构建查询条件。在Lambda表达式中,我们可以通过
::
符号指定查询对象的属性。orderby、select等方法可用于指定查询结果的排序方式和返回的列等。 -
需要注意的是,为了确保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的使用