当前位置:网站首页>递归菜单查询(递归:自己查自己)
递归菜单查询(递归:自己查自己)
2022-07-25 15:43:00 【Leon_Jinhai_Sun】
(1)level为1就是1级,children就是这一级的子菜单
(2)现有数据才能递归
(3)递归需要有入口,即从哪里开始查起
具体实现:
(1)递归的查询:
完整代码如下(解析在下面)
//========================递归查询所有菜单===========
//获取全部菜单
@Override
public List<Permission> queryAllMenuGuli() {
//1 查询菜单表所有数据
QueryWrapper<Permission> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<Permission> permissionList = baseMapper.selectList(wrapper);
//2 把查询所有菜单list集合按照要求进行封装
List<Permission> resultList = bulidPermission(permissionList);
return resultList;
}
//把返回所有菜单list集合进行封装的方法
public static List<Permission> bulidPermission(List<Permission> permissionList) {
//创建list集合,用于数据最终封装
List<Permission> finalNode = new ArrayList<>();
//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
for(Permission permissionNode : permissionList) {
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
//permissionNode这个是level为1的所有数据
finalNode.add(selectChildren(permissionNode,permissionList));
}
}
return finalNode;
}
//这个是查询二级和三级菜单:
private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
//1 因为向一层菜单里面放二层菜单,二层里面还要放三层,把对象初始化
permissionNode.setChildren(new ArrayList<Permission>());
//2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
for(Permission it : permissionList) {
//判断 id和pid值是否相同
if(permissionNode.getId().equals(it.getPid())) {
//把父菜单的level值+1
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}
//把查询出来的子菜单放到父菜单里面
permissionNode.getChildren().add(selectChildren(it,permissionList));
}
}
return permissionNode;
} //========================递归查询所有菜单
先获取全部菜单,然后再进行查询
@Override
public List<Permission> queryAllMenuGuli() {
//1 查询菜单表所有数据
QueryWrapper<Permission> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<Permission> 所有内容(未封装) = baseMapper.selectList(wrapper);
//2 把查询所有菜单list集合按照要求进行封装
List<Permission> resultList = bulidPermission(所有内容(未封装));
return resultList;
}
//把返回所有菜单list集合进行封装的方法
public static List<Permission> bulidPermission(List<Permission> permissionList【所有内容(未封装)】) {
//创建list集合,用于数据最终封装
List<Permission> finalNode 【所有内容(已封装)】= new ArrayList<>();
//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
for(Permission permissionNode【一级菜单】 : permissionList) {
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
//permissionNode这个是level为1的所有数据
finalNode所有内容(已封装).add(selectChildren(新建的方法)(permissionNode【一级菜单】,permissionList【所有内容(未封装)】));--这是要准备进行递归了
}
}
return finalNode;
}
//这个是查询二级和三级菜单:
private static Permission selectChildren(permissionNode【一级菜单】,permissionList【所有内容(未封装)】) {
//1 因为向一层菜单里面放二层菜单,二层里面还要放三层,把对象初始化
permissionNode.setChildren(new ArrayList<Permission>());
//2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
for(Permission it【二菜单的内容】 : permissionList【所有内容(未封装)】) {
//判断 id和pid值是否相同
if(permissionNode【一级菜单】.getId().equals(it【二菜单的内容】.getPid())) {
//把父菜单的level值+1
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}--锦上添花,没有也可以
//把查询出来的子菜单放到父菜单里面
permissionNode【一级菜单】.getChildren().add(selectChildren(it【二菜单的内容】,permissionList【所有内容(未封装)】));--接下来就是循环上面的步骤
}
}
return permissionNode【一级菜单】;
}
边栏推荐
- Pytoch learning notes -- seresnet50 construction
- 面试8家公司,1周拿了5个offer,分享一下自己的心得
- Boomi荣获“多元化最佳首席执行官奖”和“职业成长最佳公司奖”,在大型公司类别中跻身50强
- Leetcode - 379 telephone directory management system (Design)
- The second revolution of reporting tools
- Wechat applet
- mouseover和mouseenter的区别
- Matlab -- CVX optimization kit installation
- Leetcode - 622 design cycle queue (Design)
- MySQL—常用SQL语句整理总结
猜你喜欢

MySQL - user and permission control

Leetcode - 707 design linked list (Design)

TypeError: Unrecognized value type: <class ‘str‘> ParserError: Unknown string format

LeetCode - 232 用栈实现队列 (设计 双栈实现队列)

Okaleido launched the fusion mining mode, which is the only way for Oka to verify the current output

今天睡眠质量记录84分
![[Shakespeare: keep the fun of being a man]](/img/71/6476f2d58255c78ac8f58fbfc6a0c9.png)
[Shakespeare: keep the fun of being a man]

活动回顾|7月6日安远AI x 机器之心系列讲座第2期|麻省理工教授Max Tegmark分享「人类与AI的共生演化 」

Boomi荣获“多元化最佳首席执行官奖”和“职业成长最佳公司奖”,在大型公司类别中跻身50强

Gary Marcus: 学习语言比你想象的更难
随机推荐
Cf750f1 thinking DP
Endnote cannot edit range resolution
"Digital security" alert NFT's seven Scams
Huawei 2023 starts to warm up in advance! Zuo Shen's program code interview guide comes in handy
如何实现页面包含
兆骑科创高质量海归人才双创服务平台,线上直播路演
CVPR 2022 | 网络中批处理归一化估计偏移的深入研究
C # fine sorting knowledge points 12 exception handling (recommended Collection)
物理防火墙是什么?有什么作用?
Geogle colab notes 1-- run the.Py file on the cloud hard disk of Geogle
MySQL - Summary of common SQL statements
Dpdk packet receiving and sending problem case: non packet receiving problem location triggered by mismatched packet sending and receiving function
LeetCode - 622 设计循环队列 (设计)
MySQL—用户和权限管控
Experimental reproduction of image classification (reasoning only) based on caffe resnet-50 network
泰山OFFICE技术讲座:英寸,厘米,磅,派卡,提,行,字行,像素的换算关系
How to disable hosting when Flink SQL in flink-1.13.6 runs in yarn session mode
Reasons for data format conversion when matlab reads the displayed image
R语言偏相关性计算(Partial Correlation)、使用ggm包的pcor函数计算偏相关性(Partial Correlations)
MySQL教程71-WHERE 条件查询数据