目录
①. 条件构造器与常用的接口
②. QueryWrapper
③. UpdateWrapper
④. Condition——简化代码开发
⑤. LambdaQueryWrapper
⑥. LambdaUpdateWrapper
①. 条件构造器与常用的接口
- ①. Wrapper介绍:
条件构造器(Wrapper)的作用:
MyBatis-Plus提供的通用Mapper中,删改查(没有insert)的方法通常会需要我们传入一个条件构造器,用来生成最后执行的SQL语句。
比如List selectList( Wrapper wrapper)方法,当我们传入null时,默认生成的语句就是select * from xxx,这条语句没有查询条件,排序,子查询,模糊查询并且固定查询所有的字段,如果我们需要一些复杂的查询条件,就可以使用条件构造器来指定我们的SQL需要拼接那些查询条件。
- Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成sql的where条件
- QueryWrapper : 查询条件封装
- UpdateWrapper : Update 条件封装
- AbstractLambdaWrapper : 使用Lambda语法
- LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
- LambdaUpdateWrapper : Lambda 更新封装Wrapper
- ②. 条件构造器中各个方法及应用场景: (重中之重!)
②. QueryWrapper
- ①. 组装查询条件
查询用户名包含a,年龄在20到30直接,邮箱信息不为空的信息
(注释中的sql语句就是mybatis-plus为我们生成的sql语句,is_deleted字段为逻辑删除字段,在对数据库进行操作时都要筛选出未被逻辑删除的字段再对其进行CRUD操作)
@DisplayName("条件构造器组装查询条件")
@Test
public void test01(){
// SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
QueryWrapper<User> wrapper=new QueryWrapper<>();
wrapper.like("name","a").
between("age",20,30).
isNotNull("email");
List<User> list = userMapper.selectList(wrapper);
list.forEach(System.out::println);
}
- ②. 组装排序条件
查询用户信息,按照年龄降序排序,若年龄相同,则按id升序排序
@DisplayName("条件构造器组装排序条件")
@Test
public void test02(){
//SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 ORDER BY age DESC,id ASC
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.orderByDesc("age").orderByAsc("id");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
- ③. 组装删除条件
删除邮箱地址为null的数据
@DisplayName("条件构造器删除功能")
@Test
public void test03(){
//UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.isNull("email");
int delete = userMapper.delete(queryWrapper);
System.out.println(delete);
}
- ④. 条件的优先级(lambda中的优先级最高)
@DisplayName("使用queryWrapper来实现修改功能")
@Test
public void test04(){
//1.先查询出要修改的数据
//将(年龄大于20并且用户名中包含a)或者邮箱为Null的用户进行修改
//UPDATE user SET name=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.gt("age",20)
.like("name","a")
.or()
.isNull("email");
//2.再对其进行修改
User user=new User();
user.setName("桥桥");
int update = userMapper.update(user, queryWrapper);
System.out.println(update);
}
@DisplayName("使用queryWrapper来实现修改功能(查询的优先级)")
@Test
public void test05(){
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
//UPDATE user SET name=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
//lambda中的条件优先执行
//.and(i就是条件构造器的意思)
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like("name","a")
.and(i->i.gt("age",20).or().isNull("email"));
User user=new User();
user.setName("桥桥");
int update = userMapper.update(user, queryWrapper);
System.out.println(update);
}
- ⑤. 组装select子句,查询部分字段
查询用户的用户名、年龄
@DisplayName("查询部分字段")
@Test
public void test06(){
//SELECT name,age FROM user WHERE is_deleted=0
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.select("name","age");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
- ⑥. 子查询语句的组装
查询id<=100的用户信息
@DisplayName("条件构造器实现子查询")
@Test
public void test07(){
// SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <=6))
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.inSql("id","select id from user where id <=6");
queryWrapper.like("name","桥");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
③. UpdateWrapper
将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
@DisplayName("updateWrapper设置修改条件")
@Test
public void test08(){
//UPDATE user SET name=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
updateWrapper.like("name","a")
.and(i->i.gt("age",20).or().isNull("email"))
.set("name","旋旋").set("email","big");
int update = userMapper.update(null, updateWrapper);
System.out.println(update);
}
④. Condition——简化代码开发
- ①. 在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果
test09测试模拟了根据前端传过来的姓名、最大最小年龄来进行查询,查询前要先判断传过来的数据是否存在,若不存在则不作为查询条件。
@Test
public void test09(){
String name="";
Integer ageBegin=20;
Integer ageEnd=30;
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
//SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
if (StringUtils.isNotBlank(name)){
//isNotBlank判断某个字符串是否不为空,不为Null,不为空白符
queryWrapper.like("name",name);
}
if(ageBegin!=null){
queryWrapper.ge("age",ageBegin);
}
if (ageEnd!=null){
queryWrapper.le("age",ageEnd);
}
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
- ②. 上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写
@Test
public void test10(){
//与test09一致,简化,把判断条件放到构造语句中
//SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
String name=" ";
Integer ageBegin=20;
Integer ageEnd=30;
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(name),"name","a")
.ge(ageBegin!=null,"age",20)
.le(ageEnd!=null,"age",30);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
⑤. LambdaQueryWrapper
为了防止我们写错字段名,我们使用lambda函数式接口来访问属性对应的字段名称
@DisplayName("lambdaQueryWrapper测试")
@Test
public void test11(){
//SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age >= ? AND age <= ?)
String name="a";
Integer ageBegin=20;
Integer ageEnd=30;
LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(StringUtils.isNotBlank(name),User::getName,name)
.ge(ageBegin!=null,User::getAge,ageBegin)
.le(ageEnd!=null,User::getAge,ageEnd);
List<User> list = userMapper.selectList(lambdaQueryWrapper);
list.forEach(System.out::println);
}
⑥. LambdaUpdateWrapper
将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
@DisplayName("lambda设置修改条件")
@Test
public void test12(){
//UPDATE user SET name=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
LambdaUpdateWrapper<User> updateWrapper=new LambdaUpdateWrapper<>();
updateWrapper.like(User::getName,"a")
.and(i->i.gt(User::getAge,20).or().isNull(User::getEmail))
.set(User::getName,"旋旋").set(User::getEmail,"big");
int update = userMapper.update(null, updateWrapper);
System.out.println(update);
}