文章目录
一、条件构造器简介
查询mybatisPlus源码可以看到,条件构造器wrapper继承情况:
- Wrapper:条件构造器,最顶端的一个类
- AbstractWrapper:用于sql语句条件的封装,主要是封装where条件
- QueryWrapper:查询条件封装
- UpdateWrapper:更新条件封装
- AbstractLambdaWrapper:具有Lambda语法的条件封装
- LambdaQueryWrapper:具有Lambda语法查询条件封装
- LambdaUpdateWrapper:具有Lambda语法更新条件封装
二、逻辑删除注解
物理删除:将数据从数据库直接删除,之后无法查询到被删除的信息。
逻辑删除:设置一个删除的状态码,为0未删除,为1逻辑删除,但是还是存在数据库中,之后还可以查询到,解决了数据误删除无法恢复的问题。
在表中加一个字段isDelete,数据类型为int,为0未删除,为1逻辑删除。加上 @TableLogic
注解MyBatisPlus就可以为我们自动实现。
@TableLogic
@TableField("isdelete")
private Integer isDelete;
三、条件构造器的用法
1、QueryWrapper
查询水果信息表里面f_id包含t,并且价格在3与5之间的水果
@Test
public void queryWrapperTest01(){
// 查询水果信息表里面f_id包含t,并且价格在3与5之间的水果
QueryWrapper<Fruit> queryWrapper = new QueryWrapper<>();
queryWrapper.like("f_id","t").
between("f_price",3,10);
List<Fruit> fruits = fruitMapper.selectList(queryWrapper);
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
}
查询水果信息,按照s_id升序排序,再按照价格降序排序
@Test
public void queryWrapperOrderTest(){
// 查询水果信息,按照s_id升序排序,再按照价格降序排序
QueryWrapper<Fruit> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("s_id").orderByDesc("f_price");
List<Fruit> fruits = fruitMapper.selectList(queryWrapper);
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
}
删除价格小于8的水果
@Test
public void queryWrapperDeleteTest(){
// 删除价格小于3的水果
QueryWrapper<Fruit> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("f_price",8);
int delete = fruitMapper.delete(queryWrapper);
}
加上 @TableLogic
注解后删除都不是物理删除,而是逻辑删除,就是将数据库里面删除状态码由0变成1.
将价格大于10的水果数量都变成500
@Test
public void queryWrapperUpdateTest(){
// 将价格大于10的水果数量都变成500
QueryWrapper<Fruit> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("f_price",10);
Fruit fruit = new Fruit();
fruit.setQuantity(500);
fruitMapper.update(fruit,queryWrapper);
}
2、UpdateWrapper
将价格大于10,并且数量大于100或者名称含有c的水果的价格修改为9.99
@Test
public void updateWrapperUpdateTest(){
// 将价格大于10,并且数量大于100或者名称含有c的水果的价格修改为9.99
UpdateWrapper<Fruit> updateWrapper = new UpdateWrapper<>();
updateWrapper.gt("f_price",10).
and(i ->i.gt("quantity",100).
or().like("f_name","c"));
updateWrapper.set("f_price",9.99f);
fruitMapper.update(null,updateWrapper);
}
3、LambdaQueryWrapper
查询水果名包含fName,水果价格小于fPrice,水果数量大于quantity的水果信息。
前提条件为fName不为空串,不为null,fPrice和quantity都不为null
@Test
public void LambdaQueryWrapperTest(){
// 查询水果名包含fName,水果价格小于fPrice,水果数量大于quantity的水果信息。
// 前提条件为fName不为空串,不为null,fPrice和quantity都不为null
String fName = "a";
Integer fPrice = null;
Integer quantity = 100;
LambdaQueryWrapper<Fruit> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(StringUtils.isNotBlank(fName),Fruit::getFName,fName).
lt(fPrice != null,Fruit::getFPrice,fPrice).
gt(quantity != null,Fruit::getQuantity,quantity);
List<Fruit> fruits = fruitMapper.selectList(lambdaQueryWrapper);
for (Fruit fruit : fruits) {
System.out.println(fruit);
}
}
4、LambdaUpdateWrapper
修改水果名包含fName,水果价格小于fPrice,水果数量大于quantity的水果信息的水果名为fName。
前提条件为fName不为空串,不为null,fPrice和quantity都不为null
@Test
public void LambdaUpdateWrapperTest(){
// 修改水果名包含fName,水果价格小于fPrice,水果数量大于quantity的水果信息的水果名为fName。
// 前提条件为fName不为空串,不为null,fPrice和quantity都不为null
String fName = "a";
Integer fPrice = 10;
Integer quantity = 100;
LambdaUpdateWrapper<Fruit> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.like(StringUtils.isNotBlank(fName),Fruit::getFName,fName).
lt(fPrice != null,Fruit::getFPrice,fPrice).
gt(quantity != null,Fruit::getQuantity,quantity);
lambdaUpdateWrapper.set(Fruit::getFName,fName);
fruitMapper.update(null,lambdaUpdateWrapper);
}
修改成功: