前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL树形结构(多级菜单)的数据库表设计和查询

MySQL树形结构(多级菜单)的数据库表设计和查询

作者头像
姜同学
发布2022-10-27 16:52:47
9.3K0
发布2022-10-27 16:52:47
举报
文章被收录于专栏:姜同学姜同学

概述

想必下面的树形菜单大家都见过,但是是如何实现的,你们有没有想过?说下我是怎么想起设计这个东西的,在一个惠风和畅,风和日丽的午后,我盯着眼前已完成的项目陷入沉思,良久,我将树形菜单的每一级菜单都设计成为了单独的表,正准备写接口将所有的菜单都返回的时候,带我的哥哥给我讲了一遍树形菜单的结构与数据库如何设计,我又再一次陷入了沉思,现在反思一下可能是当时脑子很乱连递归这个基本的思想都有些难以理解了吧。

菜单树
菜单树

数据库的设计

其实简单来讲就是为每个菜单栏在添加一个parent_id字段,记录着自己父菜单的ID,以下面的菜单为例,我给出了对应数据库简单的设计,想必你一看就明白了。

菜单
菜单
菜单树数据库结构
菜单树数据库结构

树形菜单的查询

数据库的设计虽然已经完成了,但是我们如何实现查询呢?前端需要的是我们返回的树状菜单结构,那么我们自然需要一个对象去封装一下,在这里运用一下面向对象的思想考虑一下这个返回的对象要怎么封装吧

继续浏览查找答案吧。

1.封装返回结果对象Menu

代码语言:javascript
复制
@Data
public class Menu {
    @ApiModelProperty("该菜单ID")
    private Integer id;
    @ApiModelProperty("该菜单的名称")
    private String name;
    @ApiModelProperty("该菜单的父菜单的ID")
    private Integer parentId;
    @ApiModelProperty("该菜单是否可见")
    private Integer status;
    @ApiModelProperty("该菜单的类型")
    private String type;
    @ApiModelProperty("该菜单创建时间")
    private Date createTime;
    @ApiModelProperty("该菜单最后作出修改操作的时间")
    private Date updateTime;
    @ApiModelProperty("该菜单所有的子菜单")
    private List<Menu> childMenu;
}

2.编写根据ID查找菜单的SQL

代码语言:javascript
复制
@Mapper
@Repository
public interface MenuMapper extends BaseMapper<Menu> {
    @Select("select id,name,type,parent_id,status from menu where parent_id = #{id}")
    List<Menu> menuList(Integer id);
}

3.递归查询所有的菜单

代码语言:javascript
复制
@Override
public List<CategoryEntity> listWithTree() {
    // 查询出所有分类
    List<CategoryEntity> cs = this.getBaseMapper().selectList(null);
    // 筛选出所有一级分类
    return cs.stream()
            .filter(categoryEntity -> categoryEntity.getParentCid() == 0L)
            .peek(categoryEntity -> categoryEntity.setChildren(this.listChildren(categoryEntity,cs)))
            .sorted(Comparator.comparing(CategoryEntity::getSort))
            .collect(Collectors.toList());
}

private List<CategoryEntity> listChildren(CategoryEntity category,List<CategoryEntity> cs){
    // 递归查找子分类
    return cs.stream()
            .filter(entity -> entity.getParentCid().equals(category.getCatId()))
            .peek(c -> c.setChildren(this.listChildren(c,cs)))
            .sorted(Comparator.comparing(CategoryEntity::getSort))
            .collect(Collectors.toList());
}

最后记得一句话哦~~ 今天不学习明天变垃圾哦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-06T,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 数据库的设计
  • 树形菜单的查询
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档