在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。利用MyBatis-Plus的Wrapper用于构建复杂的数据库查询条件。允许链式调用。
核心条件构造器
Wrapper的层次结构为
Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
- QueryWrapper : 查询/删除条件封装
- UpdateWrapper : 修改条件封装
- AbstractLambdaWrapper : 使用Lambda 语法
- LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
- LambdaUpdateWrapper : Lambda 更新封装Wrapper
在讲解几个实现类之前,先对常用的通用方法进行讲解
常用的通用方法
g 是greater=大于
l 是 less =小于
e 是equals =等于
所以,不难看出
符号 | 描述 |
---|---|
eq | 等于 (equal) |
ne | 不等于 (not equal) |
le | 小于等于 (less than or equal) |
lt | 小于 (less than) |
gt | 大于 (greater than) |
ge | 大于等于 (greater than or equal) |
like
@Test
public void testLike() {
// 1. 使用 like 匹配 name 字段包含 "tdm" 的记录
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "tdm");
List<User> users = userMapper.selectList(wrapper);
System.out.println("like: " + users);
// 对应的 SQL 语句:SELECT * FROM user WHERE name LIKE '%tdm%'
// 2. 使用 notLike 匹配 name 字段不包含 "tdm" 的记录
QueryWrapper<User> wrapper2 = new QueryWrapper<>();
wrapper2.notLike("name", "tdm");
List<User> users2 = userMapper.selectList(wrapper2);
System.out.println("notLike: " + users2);
// 对应的 SQL 语句:SELECT * FROM user WHERE name NOT LIKE '%tdm%'
// 3. 使用 likeLeft 匹配 name 字段以 "tdm" 开头的记录
QueryWrapper<User> wrapper3 = new QueryWrapper<>();
wrapper3.likeLeft("name", "tdm");
List<User> users3 = userMapper.selectList(wrapper3);
System.out.println("likeLeft: " + users3);
// 对应的 SQL 语句:SELECT * FROM user WHERE name LIKE 'tdm%'
// 4. 使用 likeRight 匹配 name 字段以 "tdm" 结尾的记录
QueryWrapper<User> wrapper4 = new QueryWrapper<>();
wrapper4.likeRight("name", "tdm");
List<User> users4 = userMapper.selectList(wrapper4);
System.out.println("likeRight: " + users4);
// 对应的 SQL 语句:SELECT * FROM user WHERE name LIKE '%tdm'
}
还有更多在官网详细查询条件构造器 | MyBatis-Plus
Wrapper实现类
1. QueryWrapper:
-
public class WrapperTest { @Resource private UserMapper userMapper; @Test public void testQueryWrapper() { // 构建查询条件 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 查询 name 等于 "tdm" 的记录 queryWrapper.eq("name", "tdm"); // 执行查询 List<User> users = userMapper.selectList(queryWrapper); System.out.println("QueryWrapper: " + users); } }
-
QueryWrapper
是 Mybatis-Plus 提供的用于构建查询条件的类,它使用字符串形式的字段名来指定查询条件。在上面的示例中,我们使用eq("name", "tdm")
来指定查询name
字段等于 "tdm" 的记录。QueryWrapper
支持多种条件构建方法,例如ne
、gt
、lt
、ge
、le
、in
、notIn
、isNull
、isNotNull
、like
、notLike
、likeLeft
、likeRight
等。
2. UpdateWrapper:
-
public class WrapperTest { @Resource private UserMapper userMapper; @Test public void testUpdateWrapper() { // 构建更新条件 UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); // 更新 name 等于 "tdm" 的记录的 age 为 20 updateWrapper.eq("name", "tdm").set("age", 20); // 执行更新 userMapper.update(null, updateWrapper); } }
-
UpdateWrapper
是 Mybatis-Plus 提供的用于构建更新条件的类,它与QueryWrapper
类似,但用于更新操作。在上面的示例中,我们使用eq("name", "tdm").set("age", 20)
来指定更新name
字段等于 "tdm" 的记录的age
属性为 20。UpdateWrapper
支持多种条件构建方法,与QueryWrapper
相同。
3. LambdaQueryWrapper:
-
public class WrapperTest { @Resource private UserMapper userMapper; @Test public void testLambdaQueryWrapper() { // 构建查询条件 LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); // 查询 name 等于 "tdm" 的记录 lambdaQueryWrapper.eq(User::getName, "tdm"); // 执行查询 List<User> users = userMapper.selectList(lambdaQueryWrapper); System.out.println("LambdaQueryWrapper: " + users); } }
-
LambdaQueryWrapper
是 Mybatis-Plus 提供的用于构建查询条件的类,它使用 Lambda 表达式来指定字段,避免了字符串形式的字段名带来的错误风险。在上面的示例中,我们使用eq(User::getName, "tdm")
来指定查询name
字段等于 "tdm" 的记录。LambdaQueryWrapper
支持多种条件构建方法,与QueryWrapper
相同。
4. LambdaUpdateWrapper:
-
public class WrapperTest { @Resource private UserMapper userMapper; @Test public void testLambdaUpdateWrapper() { // 构建更新条件 LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); // 更新 name 等于 "tdm" 的记录的 age 为 20 lambdaUpdateWrapper.eq(User::getName, "tdm").set(User::getAge, 20); // 执行更新 userMapper.update(null, lambdaUpdateWrapper); } }
-
LambdaUpdateWrapper
是 Mybatis-Plus 提供的用于构建更新条件的类,它与LambdaQueryWrapper
类似,但用于更新操作。在上面的示例中,我们使用eq(User::getName, "tdm").set(User::getAge, 20)
来指定更新name
字段等于 "tdm" 的记录的age
属性为 20。LambdaUpdateWrapper
支持多种条件构建方法,与LambdaQueryWrapper
相同。
链式调用
MyBatis-Plus支持链式调用,因为Wrapper实现类中,方法都返回this。这样,每次方法调用后,都可以继续调用下一个方法,而不需要显式地保存和传递对象的引用。
链式调用之间默认用 AND 连接,需要用OR 或者AND的别的方法可以自行调用
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
QueryWrapper<User> queryWrapper2 =new QueryWrapper<>();
QueryWrapper<User> queryWrapper3 = new QueryWrapper<>();
/*SELECT id,name,age,email FROM user WHERE (age < ? OR age > ?)*/
queryWrapper1.lt("age", 20).or().gt("age", 30);
List<User> list1 = userService.list(queryWrapper1);
list1.forEach(System.out::println);
/*SELECT id,name,age,email FROM user WHERE (age >= ? AND age <= ?)*/
queryWrapper2.ge("age",20).le("age",30);
List<User> list2 =userService.list(queryWrapper2);
list2.forEach(System.out::println);
/*SELECT id,name,age,email FROM user WHERE (email LIKE ? AND (age < ? OR age > ?))*/
queryWrapper3.like("email", "baomidou.com").and(wrapper -> wrapper.lt("age", 30).or().gt("age", 40));
List<User> list3 = userService.list(queryWrapper3);
list3.forEach(System.out::println);
list1
list2
list3
标签:QueryWrapper,name,tdm,age,userMapper,Wrapper,查询,构造,速通 From: https://blog.csdn.net/weixin_63698171/article/details/140723090