首先看一下菜单的样子

2caa42f2dd995d96f98cdce9ce6de71c.png

根据这个样子我们定义菜单类

public class Menu {

// 菜单id

private String id;

// 菜单名称

private String name;

// 父菜单id

private String parentId;

// 菜单url

private String url;

// 菜单图标

private String icon;

// 菜单顺序

private int order;

// 子菜单

private List

// ... 省去getter和setter方法以及toString方法

}

我们根据这个类定义数据库,并插入菜单数据

DROP TABLE IF EXISTS `jrbac_menu`;

CREATE TABLE `jrbac_menu` (

`id` varchar(32) NOT NULL COMMENT '主键id,uuid32位',

`name` varchar(64) NOT NULL COMMENT '登录用户名',

`parent_id` varchar(32) DEFAULT NULL COMMENT '父菜单id',

`url` varchar(64) DEFAULT NULL COMMENT '访问地址',

`icon` varchar(32) DEFAULT NULL COMMENT '菜单图标',

`order` tinyint(4) DEFAULT '0' COMMENT '菜单顺序',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单表';

-- ----------------------------

-- Records of jrbac_menu

-- ----------------------------

INSERT INTO `jrbac_menu` VALUES ('1', 'Forms', null, 'forms.html', 'fa fa-edit', '0');

INSERT INTO `jrbac_menu` VALUES ('2', 'UI Elements', null, '', 'fa fa-wrench', '1');

INSERT INTO `jrbac_menu` VALUES ('3', 'Buttons', '2', 'buttons.html', '', '0');

INSERT INTO `jrbac_menu` VALUES ('4', 'Icons', '2', 'icons.html', null, '1');

INSERT INTO `jrbac_menu` VALUES ('5', 'Multi-Level Dropdown', '', '', 'fa fa-sitemap', '2');

INSERT INTO `jrbac_menu` VALUES ('6', 'Second Level Item', '5', 'second.html', null, '0');

INSERT INTO `jrbac_menu` VALUES ('7', 'Third Level', '5', null, '', '1');

INSERT INTO `jrbac_menu` VALUES ('8', 'Third Level Item', '7', 'third.html', null, '0');

为了演示,我们把可展开的没有做完,仅仅插入几条数据能出效果就可以了。

测试方法与递归方法

private final Gson gson = new GsonBuilder().disableHtmlEscaping().create();

@Test

public void testQueryMenuList() {

// 原始的数据

List

// 查看结果

for (Menu menu : rootMenu) {

System.out.println(menu);

}

// 最后的结果

List

// 先找到所有的一级菜单

for (int i = 0; i < rootMenu.size(); i++) {

// 一级菜单没有parentId

if (StringUtils.isBlank(rootMenu.get(i).getParentId())) {

menuList.add(rootMenu.get(i));

}

}

// 为一级菜单设置子菜单,getChild是递归调用的

for (Menu menu : menuList) {

menu.setChildMenus(getChild(menu.getId(), rootMenu));

}

Map jsonMap = new HashMap<>();

jsonMap.put("menu", menuList);

System.out.println(gson.toJson(jsonMap));

}

/**

* 递归查找子菜单

*

* @param id

* 当前菜单id

* @param rootMenu

* 要查找的列表

* @return

*/

private List

// 子菜单

List

for (Menu menu : rootMenu) {

// 遍历所有节点,将父菜单id与传过来的id比较

if (StringUtils.isNotBlank(menu.getParentId())) {

if (menu.getParentId().equals(id)) {

childList.add(menu);

}

}

}

// 把子菜单的子菜单再循环一遍

for (Menu menu : childList) {// 没有url子菜单还有子菜单

if (StringUtils.isBlank(menu.getUrl())) {

// 递归

menu.setChildMenus(getChild(menu.getId(), rootMenu));

}

} // 递归退出条件

if (childList.size() == 0) {

return null;

}

return childList;

}

menuDao.queryMenuList(null);查找的结果是一条一条的数据

f7fe819331d0220e65a95a948e3117d0.png

meuDao

package com.jrbac.dao;

import java.util.List;

import com.jrbac.entity.LoginUser;

import com.jrbac.entity.Menu;

public interface MenuDao {

/**

* 查找用户的菜单

* @param loginUser

* @return

*/

public List

}

mybatis

/p>

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT

id,`name`,parent_id,url,icon,`order`

FROM

jrbac_menu ORDER BY `order` ASC

测试程序的运行结果,对输出的json进行个格式化后的对比

C&num;递归生成HTML树,C&num;递归生成xml树

C#递归生成HTML树 public StringBuilder str = new StringBuilder();   //定义一个字符串 private void get_navigation_ ...

Java从数据库读取页面树形菜单

从数据库加载菜单及子菜单主要使用递归的方法,具体实现可看代码 首先封装一个菜单pojo public class Menu { // 菜单id private String id; // 菜单名称 p ...

java—将数据库读取的list转tree

一.引言 有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID.名称与父节点ID,读出来的数据并不是前台想要的,这个时候我们要想法处理一下都出来的list,将它变为一个树. 比如直 ...

QMenu 设置菜单图标 &amp&semi; 生成菜单树

效果图 源码 .h 文件 protected slots: void onMenuTriggered(QAction*); .cpp 文件 // 菜单 QMenu *pMenu = new QMenu ...

Java 数据库树形查询生成菜单结构

Java 数据库树形查询 JAVA从数据库读取菜单,递归生成菜单树. 定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 priv ...

JAVA递归生成树形菜单

递归生成一个如图的菜单,编写两个类数据模型Menu.和创建树形的MenuTree.通过以下过程实现: 1.首先从菜单数据中获取所有根节点. 2.为根节点建立次级子树并拼接上. 3.递归为子节点建立次级 ...

Extjs4 treePanel异步加载菜单(后台从数据库读取)

运行环境:springMVC+mybatis 一.建表 说明:0表示此节点为非叶子节点,即此节点还包括了子节点:1表示此节点为叶子节点,即此节点没有子节点.:关于图标iconCls是从Extjs的文件 ...

Java生成菜单树(目录树)的几种方式

本文介绍两种不同生成多级目录树的方式:1. 递归生成,2.  map+list 集合生成.最下方会附上完整代码. 生成树的基本规则:子节点的par_id等于父节点的id. 1. 实体类 import ...

java构建树形菜单递归工具类

1.设计菜单实体 import java.util.List; public class Menu { //菜单id private Long id; //父节点id private Long par ...

随机推荐

Sublime Text 2报&OpenCurlyDoubleQuote;Decode error - output not utf-8”错误的解决办法

[Decode error - output not utf-8] [Decode error - output not utf-8]   应该怎么办?   这是因为python配置的编译环境的编码不 ...

Spearman Rank&lpar;斯皮尔曼等级&rpar;相关系数及MATLAB实现

转自:http://blog.csdn.net/wsywl/article/details/5859751 Spearman Rank(斯皮尔曼等级)相关系数 1.简介 在统计学中,斯皮尔曼等级相关系 ...

PHP-- 获取http请求头信息

看官方文档: http://php.net/manual/zh/function.apache-request-headers.php http://php.net/manual/zh/functio ...

循序渐进Python3(七) -- 2-- 面向对象进阶

面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

html5 Canvas API

详细内容请点击 1.HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好:其次,在其他编程语言现有的优秀二维绘图API的基础上实现C ...

Minimum Size Subarray Sum 解答

Question Given an array of n positive integers and a positive integer s, find the minimal length of ...

iOS UITextView 根据输入text自适应高度

转载自:http://www.cnblogs.com/tmf-4838/p/5380495.html #import "ViewController.h" @interface V ...

深入理解Spring IOC工作原理

为什么会出现spring,spring出现解决了什么问题? 1.分析普通多层架构存在的问题 JSP->Servlet->Service->Dao 层与层之间的依赖很强,属于耦合而且是 ...

移动端弹出层加遮罩后禁止body滑动

//实现滚动条无法滚动 var mo=function(e){e.preventDefault();}; /***禁止滑动***/ function stop(){ document.body.sty ...

hashcode相等两个类一定相等吗&quest;equals呢&quest;相反呢&quest;

hashCode相等,equals也不一定相等, 两个类也不一定相等 equals相同, 说明是同一个对象, 那么hashCode一定相同 哈希表是结合了直接寻址和链式寻址两种方式,所需要的就是将需要 ...

Logo

一站式 AI 云服务平台

更多推荐