黑马程序员Java项目企业级微服务实战《学成在线》,基于SpringCloud、

在P31-P33中课程分类查询中,老师提供了SQL的分类方法,结合其他评论区的递归调用,我发觉需多次查询数据库,并且响应时间较长,于是作出一下修改:
1.只查询一次数据库,将结果放入Map中,key是父节点,value是CourseCategory集合,该Map将父节点是同一节点的数据收集成一个list,后续通过map可以快速取出。
2.递归调用,将最终树形结构存入内存中,后续不再查数据库。
3.实现了InitializingBean,重写afterPropertiesSet,在项目启动时就执行该操作。
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService, InitializingBean {
private static Map<String, List<CourseCategory>> map = new HashMap<>();
private static List<CourseCategoryTreeDto> treeDtoList;
private static final String ROOT_ID = "1";
@Autowired
private CourseCategoryMapper courseCategoryMapper;
@Override
public List<CourseCategoryTreeDto> findTreeNodes() {
if (Objects.isNull(treeDtoList)) {
List<CourseCategory> courseCategoryList = courseCategoryMapper.selectList(null);
courseCategoryList.forEach(courseCategory -> {
String parentid = courseCategory.getParentid();
List<CourseCategory> courseCategories = map.get(parentid);
if (Objects.isNull(courseCategories)) {
courseCategories = new ArrayList<>();
}
courseCategories.add(courseCategory);
map.put(parentid, courseCategories);
});
treeDtoList = map.get(ROOT_ID).stream().map(this::buildTree).collect(Collectors.toList());
map = null;
}
return treeDtoList;
}
/**
* 递归查询
*
* @param courseCategory
* @return
*/
private CourseCategoryTreeDto buildTree(CourseCategory courseCategory) {
CourseCategoryTreeDto dto = new CourseCategoryTreeDto();
BeanUtils.copyProperties(courseCategory, dto);
List<CourseCategory> children = map.get(courseCategory.getId());
if (!CollectionUtils.isEmpty(children)) {
List<CourseCategoryTreeDto> collectTreeNodes =
children.stream().map(this::buildTree).collect(Collectors.toList());
dto.setChildrenTreeNodes(collectTreeNodes);
}
return dto;
}
@Override
public void afterPropertiesSet() throws Exception {
findTreeNodes();
map = null;
}
}