java中的映射思想(map)
学会如何将一个值转换为另一个值(映射思想:map))
当我们选择4-7天时,前端传过来的数据是2,那么我们怎么将2转换为4-7去查询呢?
分析:
dayType 范围值
1 [0,3]
2 [4,7]
3 [8,14]
上面数据结构类似java中map映射结构
Map<Integer,?>map=....
----------------------------------------------------------------
范围值可以使用数字或list来存储,约定第一个值为min,第二个值为max,我们可以使用封装类TravelCondition(vo)
class TravelCondition {
private int min;
private int max;
public TravelCondition(int min,int max){...}
//这个数据需要在类创建时就有,而不是调用时产生,所以我们需要将它放到静态代码块中,随类初始化
public static final Map<Integer,TravelCondition>DAY_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))
...
}
}
------------------------------------------------------
实现步骤:
1.先初始化好上面映射map,将dayType跟范围对象映射初始化好
2.页面选择出行天数,假设是4-7天,页面往后端传入 dayType=2
3.controller中的qo对象接受dayType=2这个参数,调用map.get(dayType)
TravelCondition con =map.get(2)
4.再sql拼接就可以使用con对象了
vo对象
//将一个值转换为多个值,注意映射思想
@Getter
public class TravelCondition {
public static final Map<Integer, TravelCondition> MAP_DAY = new HashMap<>();
private int min;
private int max;
static {
MAP_DAY.put(1, new TravelCondition(0, 3));
MAP_DAY.put(2, new TravelCondition(4, 7));
MAP_DAY.put(3, new TravelCondition(8, 14));
MAP_DAY.put(4, new TravelCondition(15, Integer.MAX_VALUE));//最大20亿多
}
public TravelCondition(int min, int max) {
this.min = min;
this.max = max;
}
}
service层(mongodb高级查询)
@Override
public Page<Travel> query(TravelQuery qo) {
Query query = new Query();
//先获取对象travelCondition,里面封装了对应的最大,最小天数
TravelCondition travelCondition = TravelCondition.MAP_DAY.get(qo.getDayType());
if (travelCondition != null) {
query.addCriteria(Criteria.where("day").gte(travelCondition.getMin()).lte(travelCondition.getMax()));
}
//先获取对象travelCondition,里面封装了对应的最大,最小人均花费
TravelCondition con = TravelCondition.MAP_EXPEND.get(qo.getPerExpendType());
if (con != null) {
query.addCriteria(Criteria.where("perExpend").gte(con.getMin()).lte(con.getMax()));
}
//最新/最热排序
PageRequest pageable = null;
if (qo.getOrderType() == TravelQuery.TRAVEL_NEW) {
//最新用发布时间倒序排
pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "releaseTime");
} else if (qo.getOrderType() == TravelQuery.TRAVEL_HOT) {
//最热用点赞数倒序排
pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "thumbsupnum");
} else {
//默认按照id排
pageable = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "_id");
}
//查询总条数
long count = template.count(query, Travel.class);
if (count == 0) {
return Page.empty();
}
//拼接条件
query.with(pageable);
//查询符号条件的数据
List<Travel> list = template.find(query, Travel.class);
return new PageImpl<>(list, pageable, total);
小结
1.一般来说,如果分析出来的数据结构没有现有的domain对象进行封装,可以自定义出vo(value Object)对象对数据进行自定义封装
2.先分析出数据结构,可以用对象封装目的地和攻略分类的list集合,也可以使用map集合
3.数据组装方式
方案1:
1>查询出strategy_catalog 所有destName,并且排除重复,得到目的地名称集合
2>迭代目的地名称集合,以名称作为条件查询strategy_catalog得到该目的地下攻略分类的集合List<StrategyCatalog>maplist
3>组装成list<CatalogVO>list集合
方案2:mongodb 聚合查询
//主要是思想,当我们看到这种类似的结构时,就应该推测出它的大概结构
//如果该结构domian中没有定义的字段时,我们可以使用自定义类vo来封装他们