树形结构的表设计与Java接口实现

news2024/11/26 9:45:56

文章目录

  • 1、开发需求中的树形结构
  • 2、表结构设计
  • 3、接口实现代码
    • 模型类与接口定义
    • Mapper层开发

1、开发需求中的树形结构

树形结构在日常开发中很常见,如:

在这里插入图片描述

再比如:

在这里插入图片描述

还有:

在这里插入图片描述

2、表结构设计

这种树形结构,其 核心字段为parentId ,即父节点id。先看上面课程信息树形结构的表设计:

在这里插入图片描述

精髓就是:每条数据,id是它自己的名字,parentId是它爹的名字。根据parentId能知道它爹是谁,而它的id就是它儿子的parentId,WHERE parentId = Id就知道了它的儿子是谁。

MySQL表结构设计如下:

字段名数据类型解释是否必须
idvarchar主键,唯一标识这条数据,也是它子节点的parentId
namevarchar分类中文名称,以后要展示在前端的信息
parentIdvarchar核心字段,父节点id,它爹的名字
is_showtinyint控制这条数据是否显示,就是逻辑删除的那个味儿根据需求分析是否加,像全国省市区,自然不用
orderbyint排序字段,同层的节点,返回时谁先谁后看需求,对节点展示有顺序要求时用
is_leaftinyint是否叶子节点,1是0否看需求,方便后端的一个字段
nodelevelint层级标识字段看需求,像省市区树形,这个字段可以标识下1省级2市级3区级

3、接口实现代码

模型类与接口定义

定义返回给前端的vo类,核心属性childrenTreeNodes

//伪代码
//假设树形结构表的PO类叫TreePo
@Data
public class TreeVo extends TreePo{

	List<TreeVo> childrenTreeNodes;
}
//注意这里childrenTreeNodes类型为TreeVo,而不是TreePo,因为你儿子也有自己的儿子

随便定义个示意接口,免得突兀:

@Slf4j
@RestController
public class TreeInfocontroller{

	@GetMapping("/tree/info/list")
	public List<TreeVo> queryTreeNodes(){
		return null;
	}
}

Mapper层开发

这里以上面的行业分类树形表为例:

在这里插入图片描述

当树形结构的层级固定,比如都只有两级,此时使用表的自联结查询即可完成

# 假设表名是t_tree
# pid即核心字段parentId
SELECT
	 one.id one_id,
	 one.name one_name,
	 one.pid one_pid,
	 two.id two_id,
	 two.name two_name,
	 two.pid two_pid
FROM t_tree one
INNER JOIN t_tree two
ON one.id = two.pid
WHERE one.pid='根节点id';
# 有一条无意义数据,叫根节点,其子节点就是前端页面的第一级数据
# 有排序字段的话继续order by one.orderbyField,two.orderbyField

在这里插入图片描述

这就查出来了前两级:

在这里插入图片描述

当树形结构层级不固定,有的两级深、有的三级深,则应MySQL递归查询

WITH RECURSIVE tem_table AS(
	SELECT * FROM  t_tree one WHERE id='0'
	UNION ALL
	SELECT two.* FROM t_tree two INNER JOIN tem_table ON tem_table.id = two.pid
)

SELECT * FROM  tem_table ;
# 有排序需求时后面继续order by tem_table.id......
- tem_table是一个表名
- 使用UNION ALL 不断将每次递归得到的数据加入到表tem_table中
- select * from t_tree p where id= '0’即tem_table表中的初始数据是id=0的记录,即根节点
- 通过inner join tem_table ON tem_table.id = two.pid 找到id='0’的下级节点
- 最后select * from tem_table拿递归得到的所有数据

以上是MySQL8.0的写法,再补一个MySQL5.7版本的递归写法


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自制C++深度学习推理框架】计算图的设计思路

计算图的设计思路 什么是计算图 在深度学习推理框架中&#xff0c;计算图是一种数据结构&#xff0c;它由算子节点和数据节点组成&#xff0c;在该图中前向传播时数据从输入节点开始流动&#xff0c;经过一层层的计算后输出到输出节点&#xff0c;表示深度学习模型的计算过程…

Unity Shader variants (shader 变体)

官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 教程可以看这里 https://www.jianshu.com/p/48ad75f0b4b9 https://www.jianshu.com/p/3e6b84317097 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变…

数据结构与算法03:栈

目录 什么是栈&#xff1f; 栈在函数调用中的应用 栈的应用&#xff1a;如何实现浏览器的前进和后退功能&#xff1f; 每日一练&#xff1a;左右括号匹配 什么是栈&#xff1f; 简单地说&#xff0c;先进后出&#xff0c;后进先出的数据结构就是栈&#xff0c;可以理解为一…

面试题:什么是 TCP/IP?

目录标题 什么是 TCP/IP?1) 网络接口层:2) 网络层:3) 传输层:4) 应用层: 2.数据包3.网络接口层4.网络层1) IP:2)地址解析协议 ARP3)子网 5 传输层1&#xff09;UDP&#xff1a;2&#xff09;TCP&#xff1a; 6 应用层运行在TCP协议上的协议&#xff1a;运行在UDP协议上的协议&…

大模型即将改变世界,百度先上牌桌

“未来&#xff0c;所有的应用都将基于大模型来开发&#xff0c;每一个行业都应该有属于自己的大模型&#xff0c;大模型会深度融合到实体经济当中去。” 作者|思杭 斗斗 编辑|皮爷 出品|产业家 “大模型即将改变世界。”5月26日&#xff0c;李彦宏在中关村论坛说道。 而…

ESP32CAM开发板记录

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-05-26 ❤️❤️ 本篇更新记录 2023-05-26 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

【问题小记】解决Linux下php-fpm进程过多耗尽内存问题

最近一段时间&#xff0c;发现经常性的服务器内存耗尽&#xff0c;导致mysql服务down掉&#xff0c;一开始以为是mysql跑的太久占用较多内存&#xff0c;后来认真排查了一下原来是是PHP-FPM进程过多导致的。 今天一看内存又达到了82%&#xff0c;预计不会太久服务又会挂掉&…

深入探索: 对象构造的隐藏功能与技巧

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f383; 一、重载 &#x1f384; 二、默认字段初始化 &#x1f386; 三、无参数的构造器 ✨ 四、显式字段初始化 &#x1f38a; 五…

Vue(路由插件)

一、介绍路由 1. 路由就是一组key-value的对关系&#xff0c;多个路由需要经过路由器进行管理 2. 主要应用在SPA&#xff08;单页面应用&#xff09; 在一个页面展示功能之间的跳转 特点&#xff1a; 当跳转时候不进行页面刷新路径随着变化展示区变化但是不开启新的页签 …

总结丨SGAT单基因关联分析工具,一文上手使用

SGAT是一个免费开源的单基因分析工具&#xff0c;基于Linux系统实现自动化批量处理&#xff0c;能够快速准确的完成单基因和表型的关联分析&#xff0c;只需要输入基因型和表型原始数据&#xff0c;即可计算出显著关联的SNP位点&#xff0c;并自动生成结果报告。 前段时间陆续的…

YOLOv5白皮书-第Y4周:common.py文件解读

目录 0.导入需要的包和基本配置1.基本组件1.1 autopad1.2 Conv1.3 Focus1.4 Bottleneck1.5 BottleneckCSP1.6 C31.7 SPP1.8 Concat1.9 Contract、Expand 2.重要类2.1 非极大值抑制&#xff08;NMS&#xff09;2.2 AutoShape2.3 Detections2.4 Classify &#x1f368; 本文为&am…

【头歌实训】【基于 Logisim 的 RISC-V 处理器设计 · 终】

真的恶心&#xff0c;我哭死 目录 前言 一、说明 1、参考 2、建议 二、处理器设计 三、Control器件设计 1、加速经常性事件&#xff0c;提高效率 2、控制信号设置 1.RegWEn 2.IMMSel 3.BSel 4.ALUSel & WBSel 5.MemWEn 6.PCSel & ASel 7.ALUB 总结…

【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

一、Introduction1.1 C语言标准库1.2 历代C语言标准1.3 主流C语言编译器 二、C语言标准库2.1 常用标准头文件2.2 常用标准静态库 三、windows平台四、Linux平台五、常用头文件功能速览5.1 通用常用头文件01. stdio.h——标准输入输出02. stdlib.h——内存管理与分配、随机数、字…

Git常用命令reset和revert

Git常用命令reset和revert 1、reset 用于回退版本&#xff0c;可以指定退回某一次提交的版本。 checkout 可以撤销工作区的文件&#xff0c;reset 可以撤销工作区/暂存区的文件。 reset 和 checkout 可以作用于 commit 或者文件&#xff0c;revert 只能作用于 commit。 命…

为什么 String#equals 方法在做比较时没有使用 hashCode

一个疑问的引入 我之前出于优化常数项时间的考虑&#xff0c;想当然的认为 String#equals 会事先使用 hashCode 进行过滤 我想像中的算法是这样的 当两个 hashCode 不等时&#xff0c;直接返回 false&#xff08;对 hash 而言&#xff0c;相同的输入会得到相同的输出&#x…

数据安全复合治理框架和模型解读(0)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,当前和未来更需要专业和创新。数据安全治理要充分考虑现实数据场景,强化业务安全与数据安全治理,统一来治理,…

学会了程序替换,我决定手写一个简易版shell玩一玩...

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;程序进程替换&#x1f426;替换原理&#x1f426;替换函数&#x1f414;观察与结论&#x1f414;函数命名理解 &#x1f427;myshell编写&#x1f514;代码展示&#x1f514;效果展示 &#x1f427;myshell_p…

Vue电商项目--分页器制作

分页器静态组件 分页这个组件&#xff0c;不单单是一个页面用到了。多个页面同时用它,因此我们可以封装成一个全局组件 需要将这个分页结构拆分到components 通用的分页组件Pagination <template><div class"pagination"><button>1</butto…

【C语言】函数规则及入门知识

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 ⚡注&#xff1a;此篇文章的 部分内容 将根据《高质量 C/C 编程指南》 —— 林锐 进行说明。该部分将用橙色表示。 &#x1f525;该篇…

新手建站:使用腾讯云轻量服务器宝塔面板搭建WP博客教程

腾讯云轻量应用服务器怎么搭建网站&#xff1f;太简单了&#xff0c;轻量服务器选择宝塔Linux镜像&#xff0c;然后在宝塔面板上添加站点&#xff0c;以WordPress建站为例&#xff0c;腾讯云服务器网来详细说下腾讯云轻量应用服务器搭建网站全流程&#xff0c;包括轻量服务器配…