x
//【条件构造器Wrapper -- 简介】
/*
为了清晰表示父类子类,我们用阶梯的形式写出来,如下
Wrapper: 条件构造抽象类,最顶端父类
AbstractWrapper: 用于查询条件封装。该类是抽象类,有三个子类
QueryWrapper: 封装查询的条件。除了查询还用于删除
UpdateWrapper: 封装修改的条件,还可以封装修改的字段
AbstractLambdaWrapper: 该类是抽象类,可以使用Lambda语法。该类是抽象类,有两个子类
LambdaQueryWrapper: 使用Lambda语法来封装查询的条件。。除了查询还用于删除
LambdaUpdateWrapper: 使用Lambda语法来封装修改的条件
注意: 无论是查询,删除、修改,都可使用QueryWrapper类,原因:UpdateWrapper、QueryWrapper、AbstractLambdaWrapper的父类是同一个
注意: 下面叙述中的逻辑字段,如何判断逻辑字段对应的数据是否被删除。只需要看该逻辑字段的值即可,如果是0的话(我们创建逻辑字段时要求手动赋值为0)就表示未删除,如果是1就表示已经被逻辑删除
*/
//下面我们会讲Wrapper的其中一个子类,也就是QueryWrapper
----------------------------------------------
//【条件构造器Wrapper -- QueryWrapper类的条件查询selectList】
/*
selectList方法用于组装查询条件,具体操作如下:
1. 在src/test/java/com.huanf.mybatisplus目录下新建MyBatisPlusWrapperTest测试类
2. 在MyBatisPlusWrapperTest进行测试即可
*/
//MyBatisPlusWrapperTest类写的代码如下:
public class MyBatisPlusWrapperTest {
//作用是把要用到的成员变量进行自动装配。也就是引用我们UserMapper接口(我们在UserMapper接口继承了MyBatis-Plus提供的BaseMapper<User>接口)
private UserMapper userMapper;
//条件查询selectList
public void zidingyi_test1(){
//需求: 查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息
//由于Mapper类是最顶类,且是抽象类,所以我们需要使用Mapper类的子类,即创建'Mapper类的子类'的对象,因为是查询操作所以创建的是QueryWrapper类的对象
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<User>();
zidingyi_queryWrapper.like("user_name","a")//下面可以紧接着进行链式编程。注意user_name是数据库的字段
.between("age",20,30)//ge表示大于等于,le表示小于等于,between表示在什么之间。注意age是数据库的字段
.isNotNull("email");//isNotNull表示某个字段不为空。链式编程结束之后分号结尾。注意email是数据库的字段
//上面四行的意思: 先创建指定的条件构造器queryWrapper,再使用链式编程把条件构造器赋予各种条件。最后把赋值好的条件构造器放到下面那行
List<User> list = userMapper.selectList(zidingyi_queryWrapper);//返回值是list集合
//由于要输出集合,所以我们需要使用到forEach遍历输出
list.forEach(System.out::println);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,且你在逻辑操作时删过k条数据,那么即使k条数据符合上面条件查询的条件,k条数据也不会被查询出来
//可以理解为你之前对逻辑字段的操作虽然对数据库没有真正影响,但是对条件查询是有影响的
}
----------------------------------------------
//【条件构造器Wrapper -- QueryWrapper类的条件查询selectList -- 组装排序条件】
//MyBatisPlusWrapperTest类,添加如下:
//条件查询selectList-组装排序条件
public void zidingyi_test2(){
//需求: 查询用户信息,按照年龄的降序排序,若年龄相同,则按照id升序排序
//由于Mapper类是最顶类,且是抽象类,所以我们需要使用Mapper类的子类,即创建'Mapper类的子类'的对象,因为是查询操作所以创建的是QueryWrapper类的对象
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<User>();
zidingyi_queryWrapper.orderByDesc("age")//asc升序(默认就是这个),desc降序
.orderByAsc("uid");//注意age和uid都是数据库的字段名,一定要看看你的数据库字段名是不是叫这个。同样可以用链式编程
List<User> list = userMapper.selectList(zidingyi_queryWrapper);//返回值是list集合
//由于要输出集合,所以我们需要使用到forEach遍历输出
list.forEach(System.out::println);
}
----------------------------------------------
//【条件构造器Wrapper -- QueryWrapper类的条件删除delete】
//条件删除
public void zidingyi_test3(){
//需求: 删除邮箱地址为null的用户信息
//由于Mapper类是最顶类,且是抽象类,所以我们需要使用Mapper类的子类,即创建'Mapper类的子类'的对象,因为是删除操作所以创建的是QueryWrapper类的对象
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<User>();
zidingyi_queryWrapper.isNull("email");//isnNull表示要求哪个字段为空。由于只有一个条件所以不需要使用链式编程
int result = userMapper.delete(zidingyi_queryWrapper);//返回值是受影响的行数
System.out.println("受影响的行数是"+result);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,此时执行这里的删除方法,但是数据并不会真正删除,只是逻辑上的删除
//虽然我们查询的时候数据是被删除(也就是查询不到)的,但是数据不会被真正删除
//注意当要删除的数据没有逻辑字段时,那么就会被真正删除
----------------------------------------------
//【条件构造器Wrapper -- QueryWrapper类的条件修改】
//条件修改update
public void zidingyi_test4(){
//需求: 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
//由于Mapper类是最顶类,且是抽象类,所以我们需要使用Mapper类的子类,即创建'Mapper类的子类'的对象,因为是修改操作所以创建的是QueryWrapper类的对象
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<>();
zidingyi_queryWrapper.gt("age",20)//gt表示大于等于,也就是年龄要大于等于20
.like("user_name","a")//表示用户名中包含有a,注意链式编程中的默认连接的条件是and,所以默认就有并且的关系
.or()//注意此时就要指定连接条件,不能使用默认的and条件,因为需求是'或'。连接条件: 链式编程的多条链,每一条链就是一个条件,这些条件的关系要么是and(默认)、or、not
.isNull("email");//链式编程结束之后,用分号结尾
//由于update方法需要一个实体类(User)的对象,然后把你想修改后的值赋值到这个对象里面
User user = new User();
user.setName("小明");
user.setEmail("update@123.com");
int result = userMapper.update(user, zidingyi_queryWrapper);//返回值是受影响的行数。zidingyi_queryWrapper表示你要修改的数据要具备什么条件,user是修改后的数据
System.out.println("受影响的行数是"+result);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,并且k数据已经被逻辑删除了,那么此时执行这里的修改方法,k数据即使符合条件也不会被修改
----------------------------------------------
//【条件构造器Wrapper -- QueryWrapper类的条件修改】
//条件修改update
public void zidingyi_test4(){
//需求: 将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
//由于Mapper类是最顶类,且是抽象类,所以我们需要使用Mapper类的子类,即创建'Mapper类的子类'的对象,因为是修改操作所以创建的是QueryWrapper类的对象
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<>();
zidingyi_queryWrapper.gt("age",20)//gt表示大于等于,也就是年龄要大于等于20
.like("user_name","a")//表示用户名中包含有a,注意链式编程中的默认连接的条件是and,所以默认就有并且的关系
.or()//注意此时就要指定连接条件,不能使用默认的and条件,因为需求是'或'。连接条件: 链式编程的多条链,每一条链就是一个条件,这些条件的关系要么是and(默认)、or、not
.isNull("email");//链式编程结束之后,用分号结尾
//由于update方法需要一个实体类(User)的对象,然后把你想修改后的值赋值到这个对象里面
User user = new User();
user.setName("小明");
user.setEmail("update@123.com");
int result = userMapper.update(user, zidingyi_queryWrapper);//返回值是受影响的行数。zidingyi_queryWrapper表示你要修改的数据要具备什么条件,user是修改后的数据
System.out.println("受影响的行数是"+result);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,并且k数据已经被逻辑删除了,那么此时执行这里的修改方法,k数据即使符合条件也不会被修改
----------------------------------------------
//【条件构造器Wrapper -- QueryWrapper类的条件的优先级】
//条件的优先级
public void zidingyi_test5(){
//需求: 将用户名中包含a并且(年龄大于20或邮箱为null)的用户信息修改
//难点: 需要优先判断括号里的'年龄大于20或邮箱为null'条件
//突破点: 在条件构造器中,Lambda表达式里面的条件优先执行,也就是优先级最高,且Lambda表达式内部也可以使用链式编程
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<>();
zidingyi_queryWrapper.like("user_name","a")
.and(i->i.gt("age",20).or().isNull("email"));//用Lambda表达式,i表示条件构造器,我们可以通过i调用方法
//由于update方法需要一个实体类(User)的对象,然后把你想修改后的值赋值到这个对象里面
User user = new User();
user.setName("小红");
user.setEmail("youxianji@123.com");
int result = userMapper.update(user, zidingyi_queryWrapper);//返回值是受影响的行数
System.out.println("受影响的行数是"+result);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,并且k数据已经被逻辑删除了,那么此时执行这里的修改方法,k数据即使符合条件也不会被修改
----------------------------------------------
//【条件构造器Wrapper -- 组装查询语句,简单说就是怎么写查询条件】
//组装select字句
public void zidingyi_test6(){
//需求: 查询用户的用户名、年龄、邮箱
//难点: 不是查询所有字段的数据,查询的是指定字段的数据
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<>();
zidingyi_queryWrapper.select("user_name","age","email");
//下面那行的右边获取上面那行的条件构造器对象,然后返回值是List<Map>,表示获取的数据是Map集合,最后返回的字段是List集合
List<Map<String,Object>> mapList = userMapper.selectMaps(zidingyi_queryWrapper);
//由于是List集合,所以我们需要forEach遍历输出
mapList.forEach(System.out::println);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,并且k数据已经被逻辑删除了,那么此时执行这里的查询方法,k数据即使符合条件也不会被查询到
----------------------------------------------
//【条件构造器Wrapper -- 组装子查询语句,简单说就是怎么写子查询条件】
//组装子查询语句,简单说就是怎么写子查询条件
public void zidingyi_test7(){
//需求: 查询uid小于等于3的用户信息
//难点: 用子查询实现
QueryWrapper<User> zidingyi_queryWrapper = new QueryWrapper<>();
zidingyi_queryWrapper.inSql("uid","select uid from t_user where uid <= 3");
//下面那行的右边获取上面那行的条件构造器对象,然后返回值是List集合
List<User> list = userMapper.selectList(zidingyi_queryWrapper);
//由于是List集合,所以我们需要forEach遍历输出
list.forEach(System.out::println);
}
//注意如果k条数据里有逻辑字段,并且逻辑字段不为空,并且k数据已经被逻辑删除了,那么此时执行这里的查询方法,k数据即使符合条件也不会被查询到