文章目录
1三级类目
{
"status": 0,
"data": [{
"id": 100001,
"parentId": 0,
"name": "家用电器",
"sortOrder": 1,
"subCategories": [{
"id": 100006,
"parentId": 100001,
"name": "冰箱",
"sortOrder": 2,
"subCategories": [{
"id": 100040,
"parentId": 100006,
"name": "进口冰箱",
"sortOrder": 1,
"subCategories": []
}]
}, {
"id": 100005,
"parentId": 0,
"name": "酒水饮料",
"sortOrder": 1,
"subCategories": [{
"id": 100026,
"parentId": 100005,
"name": "白酒",
"sortOrder": 1,
"subCategories": []
}, {
"id": 100027,
"parentId": 100005,
"name": "红酒",
"sortOrder": 1,
"subCategories": []
}]
}]
}
2 查询方式有两种
使用第一种
2.1 实体类
@Data
public class CategoryVo {
private Integer id;
private Integer parentId;
private String name;
private Integer sortOrder;
private List<CategoryVo> subCategories;
}
2.2 service
如果第一次查出来在查第二层 5*5 -25次,在加第三次,更多,查询数据库的次数太多
分类类目的数据并不多。
所以: 先一次性都查出来,然后再进行操作
代码:
package com.imooc.mall.service.impl;
import com.imooc.mall.dao.CategoryMapper;
import com.imooc.mall.pojo.Category;
import com.imooc.mall.service.ICategoryService;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.imooc.mall.consts.MallConst.ROOT_PARENT_ID;
/**
* Created by 廖师兄
*/
@Service
public class CategoryServiceImpl implements ICategoryService {
@Autowired
private CategoryMapper categoryMapper;
/**
* 耗时:http(请求微信api) > 磁盘 > 内存
* mysql(内网+磁盘)
* @return
*/
@Override
public ResponseVo<List<CategoryVo>> selectAll() {
List<Category> categories = categoryMapper.selectAll();
//查出parent_id=0
// for (Category category : categories) {
// if (category.getParentId().equals(ROOT_PARENT_ID)) {
// CategoryVo categoryVo = new CategoryVo();
// BeanUtils.copyProperties(category, categoryVo);
// categoryVoList.add(categoryVo);
// }
// }
//lambda + stream
List<CategoryVo> categoryVoList = categories.stream()
.filter(e -> e.getParentId().equals(ROOT_PARENT_ID))
.map(this::category2CategoryVo)
.sorted(Comparator.comparing(CategoryVo::getSortOrder).reversed())
.collect(Collectors.toList());
//查询子目录
findSubCategory(categoryVoList, categories);//参数第一级目录,所有目录
return ResponseVo.success(categoryVoList);
}
private void findSubCategory(List<CategoryVo> categoryVoList, List<Category> categories) {
//遍历一目录,拿到parentid再去往下边查
for (CategoryVo categoryVo : categoryVoList) {
List<CategoryVo> subCategoryVoList = new ArrayList<>();
for (Category category : categories) {
//如果查到内容,设置subCategory, 继续往下查
if (categoryVo.getId().equals(category.getParentId())) {
CategoryVo subCategoryVo = category2CategoryVo(category);
subCategoryVoList.add(subCategoryVo);//查出二级目录
}
subCategoryVoList.sort(Comparator.comparing(CategoryVo::getSortOrder).reversed());
categoryVo.setSubCategories(subCategoryVoList);//将二级目录关联到一级目录上
findSubCategory(subCategoryVoList, categories);//递归,传二级目录和所有目录
}
}
}
private CategoryVo category2CategoryVo(Category category) {
CategoryVo categoryVo = new CategoryVo();
BeanUtils.copyProperties(category, categoryVo);
return categoryVo;
}
}