自关联实现三级分类树 业务逻辑层 思路

需要将从数据库中查询出的分类对象构成下面的结构

[
    {id:1,name:"手机/运行商/数码",parentId:0,depth:1,children:[
        {id:2,name:"手机通讯",parentId:1,depth:2,children:[
            {id:3,name:"智能手机",parentId:2,depth:3,children:null},
            {id:4,name:"非智能手机",parentId:2,depth:3,children:null}
        ]}
    ]},
    {id:5,name:"电脑/办公",parentId:0,depth:1,children:[....]}
]

判断Redis中是否有三级分类树

注:下面用到的三个实体类

  1. FrontCategoryTreeVO:可以理解为一个空的泛型list
private List<T> categories;
  1. FrontCategoryStandVO:就是包含category标准属性
  2. FrontCategoryEntity:除了标准分类属性,还包含一个children属性:
    下面展示 FrontCategoryEntity类多出来的属性
	/**
     * 如果当前isParent是1,则需要下级分类
     */
    private List<FrontCategoryEntity> childrens;
  1. 有【直接获取并返回】
  2. 没有【查询+利用自己创建的方法转换所有分类树,并存在Redis中】
    在这里插入图片描述

分类树存入Redis的方法

  • 第一部分:
    1.声明Map(key是分类对象的parentId,value是这个id下所有子分类对象)
    2.遍历所有分类对象,并赋值到能够保存父子关系的Entity中
    【如果key包含parentId,则把Entity放在key对应的value中(list),如果没有,则新建一个value(list)并存入】
    简单点:就是将所有parentId相同分类对象的放进map中 将所有parentId相同分类对象的放进map中
    在这里插入图片描述
  • 第二部分: (将子分类对象关联到父分类对象的children中)
    1. map.get(0L)获取一级分类:(这里默认parentId=0,是一级分类)
    1. 一级分类对象id,是二级分类对象的parentId。
  • 所以遍历一级对象,获取二级对象,并通过setChildren()的方法把二级变为一级的children

    1. 二级分类对象id,是三级分类对象的parentId。
  • 所以遍历二级对象,获取三级对象,并通过setChildren()的方法把三级变为二级的children

    1. 最后通过FrontCategoryTreeVO中categoies属性的set方法将一级分类树集合实现赋值,最终并返回
      实现效果示例图:
      在这里插入图片描述
  • 下面展示一些 代码片

//遍历所有一级分类对象,根据当前一级分类id,获取他包含的二级分类对象
        for (FrontCategoryEntity oneLevel : firstLevels) {
            Long secondLevelParentId = oneLevel.getId();
            //获取当前分类的所有子分类对象
            List<FrontCategoryEntity> secondLevels = map.get(secondLevelParentId);
            if (secondLevels == null || secondLevels.isEmpty()) {
                log.warn("当前分类没有二级分类内容:{}", secondLevelParentId);
                continue;
            }
            //遍历二级分类集合
            for (FrontCategoryEntity twoLevel : secondLevels) {
                /*根据二级分类id获取三级分类对象*/
                Long thirdLevelParentId = twoLevel.getId();
                List<FrontCategoryEntity> thirdLevels = map.get(thirdLevelParentId);
                if (thirdLevels == null || thirdLevels.isEmpty()) {
                    log.warn("当前分类没有三级分类内容:{}", secondLevelParentId);
                    continue;
                }
                /*将三级分类对象集合赋值到二级分类对象的children属性中*/
                twoLevel.setChildrens(thirdLevels);
            }
            /*将二级分类对象集合赋值到一级分类对象的children属性中*/
            oneLevel.setChildrens(secondLevels);
        }
        // 到此为止,所有对象的父子分类关系都已经构建完成
        // 最后要按照方法要求的返回值来返回
        FrontCategoryTreeVO<FrontCategoryEntity> treeVO =
                new FrontCategoryTreeVO<>();
        treeVO.setCategories(firstLevels);
        return treeVO;
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值