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

news/2024/11/18 13:35:22/

文章目录

  • 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
SELECTone.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 ALLSELECT 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.ppmy.cn/news/91886.html

相关文章

【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——内存管理与分配、随机数、字…

基于springboot自动排课系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;…

C#中的 ?,??, ?. ,?[] 四个个问号运算符

? 可空运算符 ? 单个问号 代表可空运算符&#xff0c;能够强制让一些不可为空的类型附上null 引用类型可以使用空引用表示一个不存在的值&#xff0c; 值类型通常不能表示为空。 比如: string strnull; // 正确的&#xff0c;int inull; // 错误的&#xff0c;编译器就会报语…

Git业务实践记录

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 场景描述 最近在开发一个新的功能&#xff0c;和往常一样先建了一个分支进行开发&#xff0c;开发到周期60%的时候&#xff0c;后端临时通知需要将大功能…

国内最佳的客服系统Tidio替代品是什么?

许多做跨境电商的企业都知道&#xff0c;Tidio是一款不错的为电子商务量身定制的全渠道客服系统支持工具&#xff0c;但还有其他同样不错的选择。 当前许多同类型产品以迎合欧美客户居多&#xff0c;中国用户使用不惯&#xff1b;免费版体验门槛高&#xff1b;只支持海外支付方…

基于C#制作一个ChatGPT桌面助手

基于C#制作一个ChatGPT桌面助手,在工作或者学习时提升自己的效率,工欲善其事,必先利其器。 一、前言1.1、什么是ChatGPT1.2、ChatGPT官网及key申请二、后台项目2.1、项目创建2.2、界面设置2.3、获取版本2.4、发送信息一、前言 1.1、什么是ChatGPT ChatGPT(全名:Chat Gene…

【算法】【算法杂谈】有序旋转数组中找到指定的数

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…

新产品上线前需要准备哪些产品文档呢

新产品上线前需要准备的产品文档非常重要&#xff0c;不仅有助于产品的开发过程中沟通和协作&#xff0c;而且对于后期的维护和升级也起到十分重要的作用。下面详细介绍新产品上线前需要准备哪些产品文档。 一、市场需求文档 市场需求文档&#xff08;Market Requirement Doc…