问题:MybatisPlus中如何进行有条件查询?

​ –解答:在MybatisPlus中进行条件查询有两种方式,第一种就是在XxxMapper中编写自定义SQL语句;另一种就是使用MybatisPlus提供的条件查询抽象类Wrapper,该抽象类是MybatisPlus中的顶级条件查询父类,我们一般使用其子类的子类来进行条件查询。

image-20240314105215080

​ LambdaWrapper可以使用Lambda表达式指定查询或修改条件,优点是可以确保字段的正确;

​ UpdateWrapper和QueryWrapper分别对应修改和查询时指定条件,相较于使用Lambda语法,可能会出现字段书写错误导致数据库中出现错误信息。

实际使用

QueryWrapper

1
2
3
4
5
6
7
8
9
10
@Test
public void testQueryWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//查询name中有‘张’,年龄在10~20之间并且邮箱不为空的记录
queryWrapper.like("name","张").between("age",10,20).isNotNull("email");
List<User> users = userMapper.selectList(queryWrapper);
for(User u : users){
System.out.println(u);
}
}

底层执行的SQL

1
2
==> Preparing: SELECT id,name,age,email FROM t_user WHERE (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
==> Parameters: %%(String), 10(Integer), 20(Integer)

1
2
3
4
5
6
7
@Test
public void testQueryWrapper2(){
//只查询user的name和email字段
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper.select("name", "email"));
maps.forEach(System.out::println);
}

底层执行的SQL

1
2
3
==>  Preparing: SELECT name,email FROM t_user
==> Parameters:
<== Columns: name, email

至于更多方法这里不再一一演示,请自行探索


UpdateWrapper

1
2
3
4
5
6
7
8
@Test
public void testUpdateWrapper(){
//将指定id的记录的name值修改为王五
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name","王五").eq("id",1768110773964066818L);
int count = userMapper.update(updateWrapper);
System.out.println("count:" + count);
}

底层执行的SQL

1
2
==>  Preparing: UPDATE t_user SET name=? WHERE (id = ?)
==> Parameters: 王五(String), 1768110773964066818(Long)

至于更多方法这里不再一一演示,请自行探索


LambdaWrapper

​ 使用方法和QueryWrapper、UpdateWrapper一样,只不过在指定字段时,使用的是函数式编程,防止字段写错

1
2
3
4
5
6
7
@Test
public void testLambdaQueryWrapper(){
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getName, "张").between(User::getAge, 10, 20).isNotNull(User::getEmail);
List<User> users = userMapper.selectList(lambdaQueryWrapper);
for(User u : users) System.out.println(u);
}

底层SQL

1
2
==>  Preparing: SELECT id,name,age,email FROM t_user WHERE (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
==> Parameters: %%(String), 10(Integer), 20(Integer)