MySQL树形结构(多级菜单)的数据库表设计和查询
2023-06-13 09:14:08 时间
概述
想必下面的树形菜单大家都见过,但是是如何实现的,你们有没有想过?说下我是怎么想起设计这个东西的,在一个惠风和畅,风和日丽的午后,我盯着眼前已完成的项目陷入沉思,良久,我将树形菜单的每一级菜单都设计成为了单独的表,正准备写接口将所有的菜单都返回的时候,带我的哥哥给我讲了一遍树形菜单的结构与数据库如何设计,我又再一次陷入了沉思,现在反思一下可能是当时脑子很乱连递归这个基本的思想都有些难以理解了吧。
数据库的设计
其实简单来讲就是为每个菜单栏在添加一个parent_id字段,记录着自己父菜单的ID,以下面的菜单为例,我给出了对应数据库简单的设计,想必你一看就明白了。
树形菜单的查询
数据库的设计虽然已经完成了,但是我们如何实现查询呢?前端需要的是我们返回的树状菜单结构,那么我们自然需要一个对象去封装一下,在这里运用一下面向对象的思想考虑一下这个返回的对象要怎么封装吧
继续浏览查找答案吧。
1.封装返回结果对象Menu
@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
@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.递归查询所有的菜单
@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());
}
最后记得一句话哦~~ 今天不学习明天变垃圾哦。
相关文章
- MySQL数据库的写入操作:实现记录存储的力量(mysql写入一句话)
- MySQL表缓存:提升数据库性能的可行方案(mysql表缓存)
- 下的文件MySQL目录下的文件查询实战(查询mysql目录)
- 查询MySQL安装目录:一步搞定(mysql查看安装目录)
- MySQL创建新字段:构建数据库的基础(mysql创建字段)
- MySQL数据库实现加锁机制(mysql数据加锁)
- MySQL数据库端口检查:简单易行!(查看mysql数据库端口)
- MySQL查询:利用正则表达式查询数据(mysql查询正则表达式)
- 轻松架设MySQL数据库,高效运营你的数据系统(架设mysql数据库)
- MySQL安全退出教程|25字中文MySQL退出命令(mysql退出命令)
- MySQL安全模式怎么用?简单且易懂的指南(mysql安全模式)
- MySQL查询遇到汉字乱码问题解决方案(mysql查询汉字乱码)
- 使用PHP连接MySQL数据库实现数据操作(php连接mysql类)
- 用MySQL比较生日,轻松实现日期查询和排序功能(mysql比较生日)
- 标题:使用Yum安装MySQL数据库(yum上安装mysql)
- MySQL数据库如何支撑大数据分析(mysql数据库 大数据)
- MySQL数据库详尽指南(mysql大全)
- CRM集群成功启动MySQL数据库(crm集群启动mysql)
- MySQL数据库全库导出操作指南(c mysql整库导出)
- 轻松掌控CD命令行快速导出MySql数据库(cd导出mysql数据库)
- 命令行进入MySQL,简洁之美(cmd 进人mysql)
- 缓存CMD命令清除MySQL缓存快速解决数据库性能问题(cmd命令清除mysql)
- 状态但无法连接数据库无法连接数据库的 MySQL 一直处于启动状态(mysql一直处于启动)
- 免费下载MySQL壁纸,为你的电脑增添技术风范(MYSQL下载壁纸)