1. 有参查询
1.1 有参查询流程
构建一个入参类,QueryRequest,用于封装查询参数,入参前,先校验,校验完毕后,传入service层查询,数据库里捞出数据 entity,展示时,在service层里转为VO类
- 有参条件查询流程
1.2 有参查询的校验
1.2.1 构造分页条件查询类
先构建一个分页基类,给出页码数和每页展示数据条数
public class BasicPageQueryVO {
private Integer current;
private Integer size;
public Integer getCurrent() {
if (current == null) { return 1; }
return current;
}
public void setCurrent(Integer current) {
this.current = current;
}
public Integer getSize() {
if (size == null) { return 10; }
return size;
}
public void setSize(Integer size) {
this.size = size;
}
}
再构建每个分页条件查询的query类,继承基类处理分页,举个栗子:
@Data
/** 举个指标查询的栗子 */
public class AssessIndexQuery extends BasicPageQueryVO {
/** 发布情况 */
private Integer published;
/** 要查询版本的id,eg:2024年指标 */
private Long versionId;
/** 指标名称 */
private String indexName;
/** 指标层级 */
private Integer indexLevel;
/** 查询日期 */
private String queryDate;
/** 关联的指标版本 ids,eg:2021、2022、2023年的指标版本 */
List<Long> ids;
}
1.2.2 入参校验:简单非空、格式、字符长度校验
对上面的类,我们像让前端传参时,若想要保证某些数据不为空,且日期要符合某种格式,可使用三方jar包的校验处理
举个栗子,对上面的查询类进行简单校验
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Pattern;
public class AssessIndexQuery extends BasicPageQueryVO {
/** 发布情况 */
@NotNull(message = "发布情况不能为空")
private Integer published;
/** 要查询版本的id,eg:2024年指标 */
@NotNull(message = "版本的id不能为空")
private Long versionId;
/** 指标名称 */
@NotBlank(message = "指标名称不能为空")
@Size(max = 50, message = "指标名称长度不能超过50")
private String indexName;
/** 指标层级 */
private Integer indexLevel;
/** 查询日期 */
@NotBlank(message = "查询日期不能为空,格式yyyy-MM-dd")
@Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "查询日期格式错误(yyyy-MM-dd)")
private String queryDate;
/** 关联的版本 ids */
@NotEmpty(message = "关联的 ids 不能为空")
List<Long> ids;
}
- 对各类校验的说明
- NotNull 校验包装类
- NotBlank 校验 String 字符串
- NotEmpty 校验集合
- Pattern 校验日期格式(String格式没有试过,应该也是可以校验的)
1.3 使用 Mybatis-plus 进行查询
这里使用mapper层进行数据查询:
- mapper层常用查询方法
- 条件分页查询
- 去除指定列查询
- 指定列查询
- (注)service层里有许多方法也可使用,使用方法大同小异
举个栗子
public class DAO {
@Resource
private WorkOperatorMapper workOperatorMapper;
@Resource
private AreaInfoMapper areaInfoMapper;
@Resource
private WorkAreaInfoMapper workAreaInfoMapper;
/** 为支撑某个功能的分页查询 */
public Page<WorkOperator> selectPageList(WorkOperatorQuery query) {
Page<WorkOperator> page = new Page<>(query.getCurrent(), query.getSize());
return workOperatorMapper.selectPage(page, selectWrapper(query));
}
/** mybatis-plus 进行条件分页查询 */
private LambdaQueryWrapper<WorkOperator> selectWrapper(WorkOperatorQuery query) {
LambdaQueryWrapper<WorkOperator> wrapper = new LambdaQueryWrapper<>();
wrapper
.like(StringUtils.isNotEmpty(query.getName()), WorkOperator::getName, query.getName())
.eq(query.getType() != null, WorkOperator::getType, query.getType())
.like(StringUtils.isNotEmpty(query.getPhone()), WorkOperator::getPhone, query.getPhone())
.eq(query.getWorkComp() != null, WorkOperator::getWorkComp, query.getWorkComp())
.eq(query.getAreaId() != null, WorkOperator::getAreaId, query.getAreaId())
.eq(query.getStatus() != null, WorkOperator::getStatus, query.getStatus())
.in(CollectionUtils.isNotEmpty(query.getIds()), WorkOperator::getId, query.getIds())
.orderByDesc(WorkOperator::getId);
return wrapper;
}
/** 只查询部分列,去除了 AreaInfo 的 points 列,只剩其余列 */
public List<AreaInfo> selectTreeAreaInfo() {
QueryWrapper<AreaInfo> queryWrapper = new QueryWrapper<>();
// 这里可以扩展为 Collection.contain(info.getColumn())
// 因为MP是每一列判断完后,生成sql去执行的
queryWrapper.select(AreaInfo.class, info -> !info.getColumn().equals("points"));
queryWrapper.orderByAsc("id");
return areaInfoMapper.selectList(queryWrapper);
}
/** 查询某列是否存在数据, eq(列名,数值) */
public boolean existRoad(Long id) {
QueryWrapper<WorkAreaInfoDO> wrapper = new QueryWrapper<>();
wrapper.eq("operator_owner", id);
return workAreaInfoMapper.exists(wrapper);
}
/** 查询指定列的方法, eq(列名,数值) */
public List<WorkOperator> selectWorkOperatorByIds(List<Long> ids) {
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.select("area_id","work_comp");
wrapper.in("id", ids);
return workOperatorMapper.selectList(wrapper);
}
}