MybatisPlus-条件构造器
MybatisPlus-条件构造器
AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等
wrapper中文释义:包装纸
MyBatis-Plus 的 Wrapper 类是构建复杂查询和更新条件的关键工具
它允许开发者以链式调用的方式构造 SQL 的 WHERE 子句,提供了极大的灵活性和便利性
- Wrapper接口
- AbStractWrapper抽象类(继承自Wrapper接口)
- UpdateWrapper实现类
- QueryWrapper实现类
- AbstractLambdaWrapper抽象类
- LambdaUpdateWrapper实现类
- LambdaQueryWrapper实现类
条件构造器 | MyBatis-Plus (baomidou.com)
QueryWrapper
QueryWrapper:专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and
和 or
逻辑。
查询用户名包含a,年龄在20到30之间,并且邮箱不为空的用户信息
QueryWrapper<User> userQueryWrapper = new QueryWrapper<User>(); // 实例化QueryWrapper对象
userQueryWrapper.between("age",20,30);
userQueryWrapper.like("name","a");
userQueryWrapper.isNotNull("email");
userMapper.selectList(userQueryWrapper);
实际上的SQL语句如下:
// ==> Preparing: SELECT id,name,age,email FROM user WHERE (age BETWEEN ? AND ? AND name LIKE ? AND email IS NOT NULL)
// ==> Parameters: 20(Integer), 30(Integer), %a%(String)
链式调用
我们通过链式调用的方式连续调用方法,为wrapper对象增加条件
QueryWrapper<User> userQueryWrapper = new QueryWrapper<User>();
userQueryWrapper.between("age",20,30).like("name","a").isNotNull("email");
userMapper.selectList(userQueryWrapper);
or拼接
默认的条件之间的拼接是and关键字,如果想用or关键字进行条件拼接,我们需要使用or方法
userQueryWrapper.between("age",20,30).like("name","a").or().isNotNull("email");
指定列查询
在使用QueryWrapper设置查询条件时,默认是查询全部列
如果想查询指定列,需要使用select方法,拼接select关键字
userQueryWrapper.select("name","age"); // 指定查询name列和age列
condition
我们在MyBatis中学习了动态语句标签,以实现前端参数不确定传入的动态语句
在MyBatisPlus中,每一个拼接的条件方法都提供了一个boolean condition的参数,用以控制动态sql语句查询
userQueryWrapper.eq(StringUtils.isNotBlank(name),"name",name);
// 当name不为空时,eq方法条件生效
UpdateWrapper
UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
QueryWrapper也能应用于修改,但需要用户自己准备修改的实体类数据,而且不能将数据修改为空值
当实体类属性为null则被修改语句忽略
所以,使用UpdateWrapper替代QueryWrapper进行数据修改
UpdateWrapper不只能设置条件,还能利用set()方法设置修改的数据
@Test
public void testUpdate() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>();
updateWrapper.between("age", 20, 30)
.like("name", "a")
.isNotNull("email")
.set("age", "23") // 将符合条件的年龄列设置为23
.set("email", null); // 将符合条件的邮箱列设置为null
userMapper.update(updateWrapper);
}
Lambda系列
- LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
- LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。
LambdaUpdateWrapper<User> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userLambdaUpdateWrapper.like(User::getName,"a"); // 添加条件,模糊查询a
userMapper.update(updateWrapper);
like的第一个参数使用方法引用的方式传递参数,而通过User::getName是如何获得其类的属性名呢?
其中底层逻辑十分复杂:
详解Java8中如何通过方法引用获取属性名_java通过对象get方法获取属性的名称对应的字符串-CSDN博客
其理解就是,LambdaUpdateWrapper的所需参数(代替列名)使用SerializableFunction接收
就可以通过类名::get属性名
的方式直接获取到属性名
LambdaUpdateWrapper使用此属性名,通过反射的机制获得表中列名
这种方式就不用以字符串的形式手写列名,避免了列名写错的问题
这里的底层逻辑实在是太复杂,方法引用和Lambda表达式从来都是难点,所以我们直接学习他的用法即可
总结
Wrapper的使用也只是基于BaseMapper和IService两种由MyBatisPlus生成的单表的crud,实现ORM思想
使用Wrapper的方式来替代条件crud的依赖Sql语句的问题
但归根结底,Wrapper的使用场景,或者说是MyBatisPlus的ORM也仅限于支持到单表
如果存在多表的,或者嵌套的,亦或者是特别复杂的Sql,我们仍然使用mapper.xml的映射文件搭配mapper接口来完成这种操作