就拿淘宝来举例,当我们想要买一个手机时,会根据手机的品牌、价格、颜色等多个条件来查询,然后再分页显示数据,此时就用到了多条件组合分页查询
一般我们把这个对象叫做VO(value object):通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象可以和表对应,也可以不,这根据业务的需要。
这里我用多条件组合分页查询讲师这个方法为例,在项目的实体类中,创建一个vo包,在包中创建一个TeacherQuery类,用来封装查询的条件
@Data
public class TeacherQuery implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "教师名称,模糊查询")
private String name;
@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;
@ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10")
private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换
@ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10")
private String end;
这里包含了,根据讲师名称、等级、开始时间、结束时间等条件
根据获取的条件值进行判断,拼接条件进行分页查询
@GetMapping("pageTeacherCondition/{current}/{limit}")
public ResultJson pageTeacherCondition(@PathVariable long current,@PathVariable long limit,
TeacherQuery teacherQuery) {
//1 创建page对象
Page<EduTeacher> pageTeacher = new Page<>(current,limit);
//2 构建条件
QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
// 多条件组合查询
// mybatis学过 动态sql
String name = teacherQuery.getName();
Integer level = teacherQuery.getLevel();
String begin = teacherQuery.getBegin();
String end = teacherQuery.getEnd();
//3 判断条件值是否为空,如果不为空拼接条件
if(!StringUtils.isEmpty(name)) {
//构建条件
wrapper.like("name",name);
}
if(!StringUtils.isEmpty(level)) {
wrapper.eq("level",level);
}
if(!StringUtils.isEmpty(begin)) {
wrapper.ge("gmt_create",begin);
}
if(org.springframework.util.StringUtils.isEmpty(level))
if(!StringUtils.isEmpty(end)) {
wrapper.le("gmt_create",end);
}
wrapper.orderByDesc("gmt_create");
//4 调用方法实现条件查询分页
eduTeacherService.page(pageTeacher,wrapper);
long total = pageTeacher.getTotal();//总记录数
List<EduTeacher> records = pageTeacher.getRecords(); //数据list集合
//5 返回数据
return ResultJson.ok().data("total",total).data("rows",records);
}
大致分为五个步骤:创建page对象、构建条件(使用动态sql,使用springframework中的工具类StringUtils判断条件值是否为空,如果不为空就拼接 注意: 要选择springframework包中的StringUtils,别的包可能报错)、调用方法实现条件查询分页、返回数据。
这里提一下之前的知识:
@RequestBody:接收前端传过来的json数据,把json数据封装到对象里面,但是RequestBody只能用post提交方式,get提交方式取不到前端传过来的json数据,使用post值需要在注解后边加上(required = false),表示查询的条件值可以为空,如果不加,则必须有查询条件。
@ResponseBody:用来返回数据,返回json格式的数据
查询条件为空时,则表示查询全部的数据;
随便输入一些查询条件
查询条件可以只写一条或者两条,因为用的是动态sql,得到的结果如下