其实之前已有文章写过类似的解决方案,SpringBoot 实现多级分类菜单,不过是基于项目实战内容来写,可能对阅读体验并不友好,这次我们一起从 0 走下来这个简单常用的业务开发。

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

假设我们的内容拥有

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

  • 后端语言

    • 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>

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!


腾讯云社区邀请各位技术博主加入,福利多多噢!
Last modification:July 18th, 2020 at 03:51 am
如果觉得我的文章对你有用,请随意赞赏