java從資料庫讀取菜單,遞迴產生菜單樹

來源:互聯網
上載者:User

標籤:isa   順序   ons   system   second   表徵圖   遞迴調用   char   shm   

首先看一下菜單的樣子

根據這個樣子我們定義菜單類

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<Menu> childMenus;    // ... 省去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();@Testpublic void testQueryMenuList() {    // 原始的資料    List<Menu> rootMenu = menuDao.queryMenuList(null);    // 查看結果    for (Menu menu : rootMenu) {        System.out.println(menu);    }    // 最後的結果    List<Menu> menuList = new ArrayList<Menu>();    // 先找到所有的一級菜單    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<String,Object> jsonMap = new HashMap<>();    jsonMap.put("menu", menuList);    System.out.println(gson.toJson(jsonMap));}/** * 遞迴尋找子功能表 *  * @param id *            當前菜單id * @param rootMenu *            要尋找的列表 * @return */private List<Menu> getChild(String id, List<Menu> rootMenu) {    // 子功能表    List<Menu> childList = new ArrayList<>();    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);尋找的結果是一條一條的資料

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<Menu> queryMenuList(LoginUser loginUser);}

 

mybatis

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.jrbac.dao.MenuDao">    <select id="queryMenuList" resultType="Menu">        SELECT             id,`name`,parent_id,url,icon,`order`        FROM             jrbac_menu ORDER BY `order` ASC    </select></mapper>

 

測試程式的運行結果,對輸出的json進行個格式化後的對比

java從資料庫讀取菜單,遞迴產生菜單樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.