MybatisPlus------条件构造器Wapper(七)
Wrapper:条件构造器抽象类,最顶端父类
AbstarctWrapper:用于查询条件封装,生成sql的where条件。
QueryWrapper:查询条件封装(可以用于查询、删除,更新)
UpdateWrapper:Update条件封装
AbstractLambdaWrapper:使用Lambda语法
LambdaUpdateWrapper:用于Lambda语法使用的查询Wrapper
LambdaQueryWrapper:用于Lambda语法使用的更新Wrapper
使用QueryWrapper进行更新
@Test
public void testUpdate(){
// 将(年龄大于20,并且用户名中包含有a)或邮箱为null的信息修改
//where条件
QueryWrapper<BaseProcedure> baseProcedureQueryWrapper = new QueryWrapper<>();
baseProcedureQueryWrapper.gt("age",20)
.like("procedure_name","a")
.or()
.isNull("eamil");
//更新值
BaseProcedure baseProcedure = new BaseProcedure();
baseProcedure.setProcedureName("asdasd");
int update = baseProcedureMapper.update(baseProcedure, baseProcedureQueryWrapper);
System.out.println("update"+update);
}
涉及到条件优先级怎么处理?
涉及到where子句后判断的优先级时(lambda中的条件优先执行),
例如:
将用户名中包含有a并且(年龄大于20或邮箱为null)的信息修改
@Test
public void testUpdate2(){
// 将用户名中包含有a并且(年龄大于20或邮箱为null)的信息修改
//where条件
//涉及到lambda表达式,lambda中的条件优先执行
QueryWrapper<BaseProcedure> baseProcedureQueryWrapper = new QueryWrapper<>();
baseProcedureQueryWrapper.like("procedure_name","a")
.and(i ->{
i.gt("age",20)
.or()
.isNull("eamil");
});
//更新值
BaseProcedure baseProcedure = new BaseProcedure();
baseProcedure.setProcedureName("asdasd");
int update = baseProcedureMapper.update(baseProcedure, baseProcedureQueryWrapper);
System.out.println("update"+update);
}
and()和or()中的Consumer怎么理解?
and()方法源码:
/**
* 查询条件封装
* <p>嵌套</p>
* <li>泛型 Param 是具体需要运行函数的类(也是 wrapper 的子类)</li>
*
* @author hubin miemie HCL
* @since 2017-05-26
*/
public interface Nested<Param, Children> extends Serializable {
/**
* ignore
*/
default Children and(Consumer<Param> consumer) {
return and(true, consumer);
}
Param是泛型,是具体需要运行函数的类,也就是 wrapper 的子类,就是条件构造器,因此可以将条件构造器写入and方法中。
而Consumer,是Lambda表达式中的消费者接口,消费者接口中一定是由参数的,方法中的内容就是我们对参数的操作方式,
仅需要查询部分字段如何写?
通过调用QueryWrapper的select()方法,在该方法里传入需要查询的字段即可。
@Test
public void testSelect(){
//查询用户用户名,和用户编码
QueryWrapper<BaseProcedure> baseProcedureQueryWrapper = new QueryWrapper<>();
baseProcedureQueryWrapper.select("procedure_code","procedure_name");
List<Map<String, Object>> maps = baseProcedureMapper.selectMaps(baseProcedureQueryWrapper);
maps.forEach(System.out::println);
}
子查询如何操作
通过inSql方法,传入字段,以及子查询sql即可。
案例比较简单,仅仅用来测试,无实际意义
@Test
public void testSelect02(){
//子查询
//SELECT * from base_procedure
//WHERE id = (SELECT id from base_procedure WHERE id = 'ef5397a26b7a469c6fe1de0e')
QueryWrapper<BaseProcedure> baseProcedureQueryWrapper = new QueryWrapper<>();
baseProcedureQueryWrapper.inSql("id","SELECT id from base_procedure WHERE id = 'ef5397a26b7a469c6fe1de0e'");
List<Map<String, Object>> maps = baseProcedureMapper.selectMaps(baseProcedureQueryWrapper);
maps.forEach(System.out::println);
}