1.1问题说明
原始代码结构.出现俩层循环结构,如果外层循环10个,每个内存循环也是10个,完成这项业务需要查询100次数据库
矛盾点:多次查询数据库!!!
优化策略:能否将查询的次数降到1次,就可以获取所有的数据信息
说明:数据库只查询一次,就可以获取商品分类三级嵌套结构
程序设计:
1.数据结构Map<父级ID,子级列表>列表信息中不包含嵌套关系
例如:Map<0,一级列表信息>一级列表信息不包含二级/三级
Map<一级ID,二级列表信息>只有二级列表信息
Map<二级ID,三级列表信息>只有三级表信息
2.根据数据结构动态根据level查询子级
原代码--双重for循环实现
@Override
public List<ItemCat> getItemCatList(Integer i) {
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id",0);
List<ItemCat> itemCats = itemCatMapper.selectList(queryWrapper);
for (ItemCat oneList:itemCats) {
queryWrapper.clear();
queryWrapper.eq("parent_id", oneList.getId());
List<ItemCat> seconds = itemCatMapper.selectList(queryWrapper);
oneList.setChildren(seconds);
for (ItemCat twoList:seconds) {
queryWrapper.clear();
queryWrapper.eq("parent_id", twoList.getId());
List<ItemCat> thread = itemCatMapper.selectList(queryWrapper);
twoList.setChildren(thread);
}
}
return itemCats;
}
修改后~~
@Override
public List<ItemCat> getItemCatList(Integer level) {
//1.封装Map集合
Map<Integer,List<ItemCat>> map=getMap();
if (level==1){
return map.get(0);
}
if(level==2){
return getTwoList(map);
}
if(level==3){
return getThreeList(map);
}
return null;
}
private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
//获取一级和二级
List<ItemCat> onelist = getTwoList(map);
//封装三级,遍历二级菜单,之后封装
for (ItemCat oneItem:onelist){
//获取二级集合
List<ItemCat> twolist = oneItem.getChildren();
if(twolist==null||twolist.size()==0){
continue;
}else {
for (ItemCat twoItem:twolist) {
List<ItemCat> threeList = map.get(twoItem.getId());
twoItem.setChildren(threeList);
}
}
}
return onelist;
}
private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
//1.先获取一级列表
List<ItemCat> onelist = map.get(0);
for (ItemCat oneItemCat:onelist) {
//查询二级,所以parentId是一级的id
int parentId=oneItemCat.getId();
List<ItemCat> twolist = map.get(parentId);
//封装数据
oneItemCat.setChildren(twolist);
}
return onelist;
}
/*1.查询所以的商品分类列表 查询一次
2.循环遍历所有的数据,按照paramID,List<ItemCat>方式封装数据
*/
private Map<Integer, List<ItemCat>> getMap() {
Map<Integer, List<ItemCat>> map = new HashMap<>();
List<ItemCat> list = itemCatMapper.selectList(null);
for (ItemCat itemCat:list) {
int parentId=itemCat.getParentId();
if (map.containsKey(parentId)){
//key存在
map.get(parentId).add(itemCat);
}else{
//key不存在
ArrayList<ItemCat> childList = new ArrayList<>();
childList.add(itemCat);
map.put(parentId,childList);
}
}
return map;
}