欢迎光临散文网 会员登陆 & 注册

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

2023-08-27 11:06 作者:江火似流萤丨  | 我要投稿

在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;

  }

}

黑马程序员Java项目企业级微服务实战《学成在线》,基于SpringCloud、的评论 (共 条)

分享到微博请遵守国家法律