查询 - 03 - 有参查询

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);
    }
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值