如何利用map映射设计条件类 实现带范围条件查询

效果和分析图

效果图

  • 实现这3个部分的带条件查询数据的需求
    在这里插入图片描述
  • 出发时间范围条件查询
    在这里插入图片描述
  • 人均消费范围条件查询
    在这里插入图片描述
  • 出行天数范围条件查询
    在这里插入图片描述

分析图

  • 此演示的是对游记数据的条件查询
    在这里插入图片描述

准备工作

表结构设计

  • 游记表结构,画红线即本次演示重点内容
    在这里插入图片描述

qo类

  • 红圈为此文章演示重点
  • 前端会对应的传 出行天数,人均消费,出行天数所对应的一个值,后端通过这一个值的判断,即可通过map映射得出对应的最小值和最大值的范围区间
    在这里插入图片描述

条件类设计(重点)

  • 因为求的是范围,所以设2个属性值,min和max
  • 因为前端页面有3个条件范围,1.出发时间,2.人均消费,3.出行天数,所以要设3个map集合去封装所对应的值
  • 通过static静态代码块,初始化加载的时候,就将此3个map内的值给设定好
  • 看前端传过来的是什么key值,则对应返回所需的min和max值,即给后端sql语句查询出过滤后的数据
@Getter
public class TravelCondition {
    private int min;
    private int max;

    public TravelCondition(int min, int max) {
        this.min = min;
        this.max = max;
    }

//    旅游天数
    public static final Map<Integer, TravelCondition> DAY_MAP = new HashMap<>();
//    人均消费
    public static final Map<Integer, TravelCondition> AVG_MAP = new HashMap<>();
//    出行天数
    public static final Map<Integer, TravelCondition> TIME_MAP = new HashMap<>();
    static {
        DAY_MAP.put(1,new TravelCondition(0,3));
        DAY_MAP.put(2,new TravelCondition(4,7));
        DAY_MAP.put(3,new TravelCondition(8,14));
        DAY_MAP.put(4,new TravelCondition(15,Integer.MAX_VALUE));

        AVG_MAP.put(1,new TravelCondition(1,999));
        AVG_MAP.put(2,new TravelCondition(1000,6000));
        AVG_MAP.put(3,new TravelCondition(6001,20000));
        AVG_MAP.put(4,new TravelCondition(20001,Integer.MAX_VALUE));

        TIME_MAP.put(1,new TravelCondition(1,2));
        TIME_MAP.put(2,new TravelCondition(3,4));
        TIME_MAP.put(3,new TravelCondition(5,6));
        TIME_MAP.put(4,new TravelCondition(7,8));
        TIME_MAP.put(5,new TravelCondition(9,10));
        TIME_MAP.put(6,new TravelCondition(11,12));
    }
}

查询流程代码

前端访问路径

  • 下面3个下拉框,每个下拉框的每个范围都是分别传递一个值给后端(总计3个值),后端通过这个值作为key,则查找对应map查出对应的value(条件类),此条件类则含有对应的min值和max值,即可进行过滤查询
    在这里插入图片描述
  • travelTimeType为出行天数下拉框的参数
  • consumeType为人均消费下拉框的参数
  • dayType为出发时间下拉框的参数
  • 以上3个参数值,则是作为qo类的属性值传给后端
    在这里插入图片描述

后端接口

  • 这里使用了分页查询
    在这里插入图片描述

业务实现方法

  • 将qo中的过滤参数值作为key,通过查找条件类内的map数据,即可返回一个有min和max值的条件类
  • wrapper 通过ge(大于等于)和le(小于等于)的方法,拼接min和max值,即可完成sql语句对数据的条件过滤操作
  • 使用 super.page(page, wrapper); 即可完成数据的过滤(可以直接返回给前端了)
  • 拓展部分:遍历page.getRecords() 可获得每一条游记数据,通过里面的getAuthorId()获取对应的用户所有信息,将用户的所有信息再封装进每一个游记对象内,再返回即可(此部分与本文演示重点无关,属于是拓展,可忽略不计)
@Autowired
    private TravelContentMapper travelContentMapper;
    @Autowired
    private IUserInfoService userInfoService;

    @Override
    public IPage<Travel> queryPage(TravelQuery qo) {
        IPage<Travel> page = new Page<>(qo.getCurrentPage(), qo.getPageSize());
        QueryWrapper<Travel> wrapper = Wrappers.<Travel>query();
        wrapper.eq(qo.getDestId() != null, "dest_id", qo.getDestId());

//     出行天数
//        dayType =2  ---------> new TravelCOndition(4,7)
        TravelCondition day = TravelCondition.DAY_MAP.get(qo.getDayType());
        if (day != null) {
            wrapper.ge("day", day.getMin()).le("day", day.getMax());
        }
//    人均消费
        TravelCondition avg = TravelCondition.AVG_MAP.get(qo.getConsumeType());
        if (avg != null) {
            wrapper.ge("avg_consume", avg.getMin()).le("avg_consume", avg.getMax());
        }
//        出行时间
        TravelCondition time = TravelCondition.TIME_MAP.get(qo.getTravelTimeType());
        if (time != null) {
            wrapper.ge("DATE_FORMAT(travel_time,'%m')", time.getMin())
                    .le("DATE_FORMAT(travel_time,'%m')", time.getMax());
        }

//      排序
        wrapper.orderByDesc(StringUtils.hasLength(qo.getOrderBy()), qo.getOrderBy());

        super.page(page, wrapper);
        for (Travel record : page.getRecords()) {
            UserInfo user = userInfoService.getById(record.getAuthorId());
            record.setAuthor(user);
        }
        return page;
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值