前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现多级分类嵌套数据的展示

实现多级分类嵌套数据的展示

作者头像
乐心湖
发布2020-07-31 15:19:47
1.1K0
发布2020-07-31 15:19:47
举报
文章被收录于专栏:MyTechnologyMyTechnology

首先可以看一下这个表结构。

假设我们的内容拥有

展示出来就是这样一个结构

  • 后端语言
    • java
      • spring
    • python
  • 运维技术
    • linux
    • docker

接下来我们基于 SpringBoot + Mybatis 来完成这个业余。

我将展示 xml 和 Java代码 两种方式。

实体类

我们要对他进行封装成带有下一级的实体Vo

我新建了一个 LevelCatalogVo 在 LevelCatalog 原有的基础上加上了 List<LevelCatalogVo> 属性

接下来我们去写这个 APi 接口

我们去 Service 层中写具体的逻辑实现了。

这个是主要方法:查询出所有的内容,然后通过代码我们一一来封装成对象,这样我们对MySQL的查询只有一次。

public List<LevelCatalogVo> info() {
    //取出所有的内容
    List<LevelCatalog> levelCatalogs = baseMapper.selectList(null);
    //创建一个需要返回的vo展示集合对象
    List<LevelCatalogVo> levelCatalogVos = new ArrayList<>();
    //所有内容进行遍历
    for (LevelCatalog levelCatalog : levelCatalogs) {
        //找出一级分类,赋值到vo类,加入到集合中去
        if (levelCatalog.getParentId() == 0){
            LevelCatalogVo levelCatalogVo = new LevelCatalogVo();
            BeanUtils.copyProperties(levelCatalog,levelCatalogVo);
            //为一级分类设置子分类
            levelCatalogVo.setChildren(getChildrens(levelCatalogVo,levelCatalogs));
            levelCatalogVos.add(levelCatalogVo);
        }
    }
    return levelCatalogVos;
}
private List<LevelCatalogVo> getChildrens(LevelCatalogVo root, List<LevelCatalog> levelCatalogs) {
    //由于子分类下可能还有子分类,因此依旧需要创建一个需要返回的vo展示集合对象
    List<LevelCatalogVo> levelCatalogVos = new ArrayList<>();
    //依旧将所有内容进行遍历
    for (LevelCatalog levelCatalog : levelCatalogs) {
        //取出相应子类,加到集合中并返回
        if (root.getId().equals(levelCatalog.getParentId())){
            LevelCatalogVo levelCatalogVo = new LevelCatalogVo();
            BeanUtils.copyProperties(levelCatalog,levelCatalogVo);
            //使用递归,循序渐进式设置完各大小级分类
            levelCatalogVo.setChildren(getChildrens(levelCatalogVo,levelCatalogs));
            //最总加入到集合中去
            levelCatalogVos.add(levelCatalogVo);
        }
    }
    return levelCatalogVos;
}

完成 controller 层调用后,访问得到的信息正如我们所需。


Mybatis xml 的方式

这种就简单的多了,Mybatis 会帮我们做好一切,但是他对Mysql的查询是多次的,而不是一次查完,因此数据量超大的情况下性能会大打折扣。

结果跟上面也是一模一样的。

<resultMap id="result" type="com.xn2001.entity.LevelCatalogVo">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <collection property="children" column="id"
                ofType="com.xn2001.entity.LevelCatalogVo"
                select="info2"/>
</resultMap>

<select id="info2" resultMap="result">
    select id, name, parent_id from level_catalog where parent_id = #{parentId}
</select>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档