java实现递归菜单树

 更新时间:2020年08月26日 09:16:53   作者:男人要霸气  
这篇文章主要为大家详细介绍了java实现递归菜单树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现递归菜单树的具体代码,供大家参考,具体内容如下

1.表结构

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `menu_name` varchar(64) NOT NULL COMMENT '菜单名称',
 `order_num` int(11) DEFAULT NULL COMMENT '菜单顺序',
 `url` varchar(64) DEFAULT NULL COMMENT '菜单路径',
 `pid` varchar(11) DEFAULT NULL COMMENT '上级Id',
 `icon` varchar(255) DEFAULT NULL COMMENT '菜单图标',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES ('1', '系统管理', '1', '', '0', null);
INSERT INTO `menu` VALUES ('2', '轨迹查询', '2', '', '0', null);
INSERT INTO `menu` VALUES ('3', '设备信息', '3', '', '0', null);
INSERT INTO `menu` VALUES ('4', '用户信息', '1', '', '1', null);
INSERT INTO `menu` VALUES ('5', '客户信息', '2', null, '1', null);
INSERT INTO `menu` VALUES ('6', '用户资料', '1', null, '4', null);
INSERT INTO `menu` VALUES ('7', '客户资料', '1', null, '5', null);
INSERT INTO `menu` VALUES ('8', '切割机', '1', null, '3', null);
INSERT INTO `menu` VALUES ('9', '铲车', '2', null, '3', null);
INSERT INTO `menu` VALUES ('10', '割片', '1', null, '8', null);

2.菜单实体类

import lombok.Data;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;


/**
 *
 * @author m
 * @email 123456789@qq.com
 * @date 2019-12-13 16:54:59
 */
@Data
@Table(name = "menu")
public class Menu implements Serializable {
 private static final long serialVersionUID = 1L;
 
 //
 @Id
 private Integer id;
 
 //菜单名称
 @Column(name = "menu_name")
 private String menuName;
 
 //菜单顺序
 @Column(name = "order_num")
 private Integer orderNum;
 
 //菜单路径
 @Column(name = "url")
 private String url;
 
 //上级Id
 @Column(name = "pid")
 private String pid;
 
 //菜单图标
 @Column(name = "icon")
 private String icon;

 //子菜单
 @Transient
 private List<Menu> children;


}

3.菜单树

 /**
  * 获取菜单树
  * @return
  */
 public List<Menu> menuTree() {
  //查询所有菜单
  List<Menu> menus = mapper.selectAll();
  //返回的菜单树
  List<Menu> rootMenus = new ArrayList<>();
  for (Menu menu : menus) {
   //pid(上级Id)为0的是根菜单
   if ("0".equals(menu.getPid())) {
    rootMenus.add(menu);
   }
  }
  //遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
  for (Menu rootMenu : rootMenus) {
   List<Menu> child = getChild(String.valueOf(rootMenu.getId()), menus);
   rootMenu.setChildren(child);
  }
  return rootMenus;
 }


 /**
  * 递归获取下级菜单
  * @param pid 上级Id
  * @param menus 所有菜单
  * @return
  */
 public List<Menu> getChild(String pid, List<Menu> menus) {
  //子菜单列表
  List<Menu> childList = new ArrayList<>();
  for (Menu menu : menus) {
   if (pid.equals(menu.getPid())) {
    childList.add(menu);
   }
  }
  //遍历 获取子菜单的子菜单
  for (Menu menu : childList) {
   List<Menu> child = getChild(String.valueOf(menu.getId()), menus);
   menu.setChildren(child);
  }
  //递归出口 childList长度为0
  if (childList.size() == 0) {
   return new ArrayList<>();
  }
  return childList;
 }

4.测试

{
 "status": 200,
 "message": "操作成功",
 "data": [
  {
   "id": 1,
   "menuName": "系统管理",
   "orderNum": 1,
   "url": "",
   "pid": "0",
   "icon": null,
   "children": [
    {
     "id": 4,
     "menuName": "用户信息",
     "orderNum": 1,
     "url": "",
     "pid": "1",
     "icon": null,
     "children": [
      {
       "id": 6,
       "menuName": "用户资料",
       "orderNum": 1,
       "url": null,
       "pid": "4",
       "icon": null,
       "children": []
      }
     ]
    },
    {
     "id": 5,
     "menuName": "客户信息",
     "orderNum": 2,
     "url": null,
     "pid": "1",
     "icon": null,
     "children": [
      {
       "id": 7,
       "menuName": "客户资料",
       "orderNum": 1,
       "url": null,
       "pid": "5",
       "icon": null,
       "children": []
      }
     ]
    }
   ]
  },
  {
   "id": 2,
   "menuName": "轨迹查询",
   "orderNum": 2,
   "url": "",
   "pid": "0",
   "icon": null,
   "children": []
  },
  {
   "id": 3,
   "menuName": "设备信息",
   "orderNum": 3,
   "url": "",
   "pid": "0",
   "icon": null,
   "children": [
    {
     "id": 8,
     "menuName": "切割机",
     "orderNum": 1,
     "url": null,
     "pid": "3",
     "icon": null,
     "children": [
      {
       "id": 10,
       "menuName": "割片",
       "orderNum": 1,
       "url": null,
       "pid": "8",
       "icon": null,
       "children": []
      }
     ]
    },
    {
     "id": 9,
     "menuName": "铲车",
     "orderNum": 2,
     "url": null,
     "pid": "3",
     "icon": null,
     "children": []
    }
   ]
  }
 ]
}

5.菜单树工具类

菜单树工具类

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot工程下Lombok的应用教程详解

    SpringBoot工程下Lombok的应用教程详解

    这篇文章主要给大家介绍了关于SpringBoot工程下Lombok应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mybatis调用mysql存储过程并获取返回值方式

    mybatis调用mysql存储过程并获取返回值方式

    这篇文章主要介绍了mybatis调用mysql存储过程并获取返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • selenium操作隐藏的元素(python+Java)

    selenium操作隐藏的元素(python+Java)

    这篇文章主要介绍了selenium操作隐藏的元素(python+Java),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • springboot使用spring-data-jpa操作MySQL数据库

    springboot使用spring-data-jpa操作MySQL数据库

    这篇文章主要介绍了springboot使用spring-data-jpa操作MySQL数据库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java基础之List内元素的排序性能对比

    Java基础之List内元素的排序性能对比

    这篇文章主要介绍了Java基础之List内元素的排序性能对比,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java中字符串替换的四种方法举例总结

    Java中字符串替换的四种方法举例总结

    Java提供了多种方法来替换字符串,其中最常用的是使用replace()方法和正则表达式,下面这篇文章主要给大家介绍了关于Java中字符串替换的四种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • java中将一个List等分成n个list的工具方法(推荐)

    java中将一个List等分成n个list的工具方法(推荐)

    下面小编就为大家带来一篇java中将一个List等分成n个list的工具方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • JPA中@JoinColumn的name和referencedColumnName属性的区别及说明

    JPA中@JoinColumn的name和referencedColumnName属性的区别及说明

    这篇文章主要介绍了JPA中@JoinColumn的name和referencedColumnName属性的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java:DocumentBuilderFactory调用XML的方法实例

    Java:DocumentBuilderFactory调用XML的方法实例

    Java:DocumentBuilderFactory调用XML的方法实例,需要的朋友可以参考一下
    2013-04-04
  • Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    这篇文章主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下
    2015-04-04

最新评论