Mybatis(16)Mybatis-Plus条件构造器(1)
文章目录
- Mybatis(16)Mybatis-Plus条件构造器(1)
- [1. 条件构造器](#1. 条件构造器)
- [2. QueryWrapper 使用举例:](#2. QueryWrapper 使用举例:)
- [3. UpdateWrapper 使用举例:](#3. UpdateWrapper 使用举例:)
-
- [3.1 简单更新(更新一条记录):](#3.1 简单更新(更新一条记录):)
- [3.2 两种更新方式(推荐使用 UpdateWrapper):](#3.2 两种更新方式(推荐使用 UpdateWrapper):)
- [3.3 复杂更新(一次更新多条记录):](#3.3 复杂更新(一次更新多条记录):)
- [3.4 拼接 sql字段:](#3.4 拼接 sql字段:)
- [3.4 UpdateWrapper 总结:](#3.4 UpdateWrapper 总结:)
- [4. 总结](#4. 总结)
观前提醒:
如果你是第一次点击这篇博客,需要你回看Mybatis-plus系列的这个博客:
Mybatis(15)@TableName注解 & @TableField注解 & @TableId注解
这篇博客的代码,都是需要自己敲一下的。
建议你看着我说的知识点,自己尝试一下,创建 Springboot项目,使用 Mybatis-plus 框架,访问数据库。
这里使用的数据库是 MySQL。
图形化工具:Navicat
sql文件获取:https://gitee.com/mrbgvhbhjv/java-ee-course

1. 条件构造器
1.1条件构造器(Wrapper)简单介绍:
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。
Wrapper 类 允许开发者以链式调用的方式构造查询条件 ,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
换句话说:条件构造器(Wrapper)配合 实体类接口继承BaseMapper<T> 后,提供的 select,delete,updata 方法,自动生成 select,delete,updata 语句
条件构造器(Wrapper )+ select,delete,updata 方法 == SQL中的 select,delete,updata 语句
在 MyBatis-Plus 中,Wrapper 类是构建 查询和更新条件 的核心工具。以下是主要的 Wrapper 类及其功能:
- AbstractWrapper :这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
- QueryWrapper :专门用于构造查询条件 ,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用
and和or逻辑。 - UpdateWrapper :用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
- LambdaQueryWrapper :这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
- LambdaUpdateWrapper :类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。
MyBatis-Plus 的 Wrapper 类是构建复杂查询和更新条件的关键工具。
查询语句:select
查询条件,更新条件:where id = ?
它允许开发者以 链式调用 的方式构造 SQL 的 WHERE 子句,提供了极大的灵活性和便利性。
什么是链式调用?
方法调用方法,就可以认为是链式调用。
代码举例:

2. QueryWrapper 使用举例:
QueryWrapper并不只用于查询语句, 无论是 修改, 删除, 查询, 都可以使用QueryWrapper来构建查询条件(where)
注意:QueryWrapper 不用于 新增语句(insert)
QueryWrapper类 的常用方法:
• lt :"less than" 的缩写,表示 小于。
• le :"less than or equal to"的缩写, 表示 小于等于
• ge :"greater than or equal to" 的缩写, 表示大于等于。
• gt :"greater than" 的缩写, 表示大于。
• eq :"equals" 的缩写, 表示等于。
• ne :"not equals" 的缩写, 表示不等于.
2.1 查询:
代码:

java
@Test
void selectByCondition(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id","username","password","age","gender","phone")
.eq("age",20)
.like("username","min");
List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);
// 等价于 sql:select id,username,`password`,age,gender,phone from user_info where age=20 and username like "%min%";
// 第一种输出方式:lambda表达式
// userInfos.forEach(System.out::println);
// 第二种:流(stream)
// userInfos.stream().forEach(x -> System.out.println(x));
// 第三种:for each循环
for (UserInfo userInfo : userInfos) {
System.out.println(userInfo.toString());
}
}
等价于 sql:
sql
select id,username,`password`,age,gender,phone from user_info where age=20 and username like "%min%";
运行结果:

代码解释:

2.2 删除:
代码:

java
@Test
void deleteByCondition(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id",6);
userInfoMapper.delete(queryWrapper);
// 等价于 sql:delete from user_info where id = 6;
}
等价于 sql:
sql
delete from user_info where id = 6;
运行效果:

代码解释:

2.3 更新(简单更新):
代码:

java
@Test
void updateByCondition(){
UserInfo userInfo = new UserInfo();
userInfo.setDeleteFlag(1);
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("age",20);
// 等价于 sql:update user_info set delete_flag = 1 where age < 20;
userInfoMapper.update(userInfo,queryWrapper);
}
等价于 sql:
sql
update user_info set delete_flag = 1 where age < 20;
运行结果:

代码解释:

上述代码,构成了一条完整的 sql语句:update user_info set delete_flag=1 where age < 20
这里的update,需要传两个参数:
- user_info表对应的实体类对象 userinfo
- QueryWrapper类 的对象:queryWrapper
第二种写法,使用 UpdateWrapper类。
QueryWrapper总结:
QueryWrapper,你可以这么理解它的用法:
- 实例化 QueryWrapper类 的对象,QueryWrapper对象,调用相应的方法,构建 where语句(相等,大于,小于等条件)
- 实体类接口(UserInfoMapper)的对象(userInfoMapper),调用对应的 select,delete,update 方法,表示这条 sql语句 是 select,delete,updata语句。
更简洁点:
QueryWrapper对象 ,构建 where语句。
实体类接口的对象,调用方法 ,确定 select,delete,updata 语句
3. UpdateWrapper 使用举例:
对于更新, 我们也可以直接使用 UpdateWrapper, 在不创建实体对象的情况下, 直接设置更新字段和条件。
UpdateWrapper类的常用逻辑判断方法:
• lt :"less than" 的缩写,表示 小于。
• le :"less than or equal to"的缩写, 表示 小于等于
• ge :"greater than or equal to" 的缩写, 表示大于等于。
• gt :"greater than" 的缩写, 表示大于。
• eq :"equals" 的缩写, 表示等于。
• ne :"not equals" 的缩写, 表示不等于.
3.1 简单更新(更新一条记录):
代码:

java
@Test
void updateByCondition2(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("delete_flag",0).lt("age",20);
// 等价于 sql:update user_info set delete_flag = 0 where age < 20;
userInfoMapper.update(updateWrapper);
}
等价于 sql:
sql
update user_info set delete_flag = 0 where age < 20;
运行结果:

代码解释:

这里的更新,用到的也是 update方法。
这个方法,只需要传入一个参数:UpdateWrapper类 的对象 updateWrapper
3.2 两种更新方式(推荐使用 UpdateWrapper):
更新操作,更推荐使用 UpdateWrapper,清晰明了,代码也足够简洁。
3.3 复杂更新(一次更新多条记录):
实现下面的 sql语句:
sql
-- 一次更新多条记录
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
代码:

java
@Test
void updateByCondition3(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("delete_flag",0).set("age",5)
.in("id",List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
运行结果:

代码解释:

3.4 拼接 sql字段:
sql
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
代码:

java
@Test
void updateByCondition4(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.setSql("age = age+10")
.in("id",List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
运行结果:

代码解释:

3.4 UpdateWrapper 总结:
UpdateWrapper ,你可以这么理解它的用法:
-
实例化 UpdateWrapper 类 的对象,UpdateWrapper 对象,调用各种方法:

构建 where语句(相等,大于,小于等条件),in 关键字;拼接 sql片段......
-
实体类接口(UserInfoMapper)的对象(userInfoMapper),调用 update 方法,表示这条 sql语句 是 updata语句。
UpdateWrapper 这个构造器,是为了 update语句 而设计的。
UpdateWrapper类的常用逻辑判断方法:
• lt :"less than" 的缩写,表示 小于。
• le :"less than or equal to"的缩写, 表示 小于等于
• ge :"greater than or equal to" 的缩写, 表示大于等于。
• gt :"greater than" 的缩写, 表示大于。
• eq :"equals" 的缩写, 表示等于。
• ne :"not equals" 的缩写, 表示不等于.
4. 总结
条件构造器:QueryWrapper 使用举例,UpdateWrapper 使用举例。
还有另外两种:LambdaQueryWrapper ,LambdaUpdateWrapper ,这两个的举例使用,在
Mybatis(17)Mybatis-Plus条件构造器(2)& 自定义 SQL中进行讲解。
这篇博客的代码,多练习几遍。
更详细的使用,建议看官方文档:MyBatis-Plus 🚀 为简化开发⽽⽣
最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!