zoukankan      html  css  js  c++  java
  • Java从数据库读取页面树形菜单

    从数据库加载菜单及子菜单主要使用递归的方法,具体实现可看代码

    首先封装一个菜单pojo

    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;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getParentId() {
            return parentId;
        }
    
        public void setParentId(String parentId) {
            this.parentId = parentId;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getIcon() {
            return icon;
        }
    
        public void setIcon(String icon) {
            this.icon = icon;
        }
    
        public int getOrder() {
            return order;
        }
    
        public void setOrder(int order) {
            this.order = order;
        }
    
        public List<Menu> getChildMenus() {
            return childMenus;
        }
    
        public void setChildMenus(List<Menu> childMenus) {
            this.childMenus = childMenus;
        }
    }
    

      然后写dao接口

    package com.xfma.dao;
    
    import com.xfma.pojo.Menu;
    
    import java.util.List;
    
    public interface MenuMapper {
        /**
         * 查找用户的菜单
         * @return
         */
        public List<Menu> queryMenuList();
    }
    

      接着mybatis配置映射文件

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

      接下来是service接口

    package com.xfma.service;
    
    import com.xfma.pojo.Menu;
    
    import java.util.List;
    
    public interface IMenuService {
        public List<Menu> listMenu();
    }
    

      service实现类

    package com.xfma.service.impl;
    
    import com.xfma.dao.MenuMapper;
    import com.xfma.pojo.Menu;
    import com.xfma.service.IMenuService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.util.StringUtils;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Service
    public class MenuService implements IMenuService {
    
        @Autowired
        private MenuMapper menuMapper;
    
        public List<Menu> listMenu() {
            List<Menu> rootMenus = menuMapper.queryMenuList();
            List<Menu> list = getMenuList(rootMenus);
            return list;
        }
    
        /**
         * 找出一级菜单和二级菜单
         * @param rootMenus
         * @return
         */
        private List<Menu> getMenuList(List<Menu> rootMenus){
            List<Menu> list = new ArrayList<Menu>();
            // 先找到所有的一级菜单
            for (int i=0;i<rootMenus.size();i++){
                Menu menu = rootMenus.get(i);
                //一级菜单  没有父节点
                if (StringUtils.isEmpty(menu.getParentId())){
                    list.add(menu);
                }
            }
    
            //查找二级菜单
            /**
             * 利用递归找出所有子菜单
             */
            for (Menu menu: list) {
                menu.setChildMenus(getChild(menu.getId(),rootMenus));
            }
    
            return list;
    
        }
    
        /**
         * 找出子菜单
         * @param id
         * @param rootMenu
         * @return
         */
        private List<Menu> getChild(String id, List<Menu> rootMenu) {
            // 子菜单
            List<Menu> childList = new ArrayList<Menu>();
    
            for (Menu menu : rootMenu) {
                // 遍历所有节点,将父菜单id与传过来的id比较
                if (!StringUtils.isEmpty(menu.getParentId())) {
                    if (menu.getParentId().equals(id)) {
                        childList.add(menu);
                    }
                }
            }
    
            // 把子菜单的子菜单再循环一遍
            for (Menu menu : childList) {// 没有url子菜单还有子菜单
                if (StringUtils.isEmpty(menu.getUrl())) {
                    // 递归
                    menu.setChildMenus(getChild(menu.getId(), rootMenu));
                }
            }
    
            // 递归退出条件
            if (childList.size() == 0) {
                return null;
            }
    
            return childList;
        }
    }
    

      返回的结果是已经封装好的各个菜单和子菜单,只需前台遍历就可以了。

    下面附上SQL脚本:

    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');
    

      

  • 相关阅读:
    java Thread之ThreadLocal(线程局部变量)
    java设计模式之接口隔离原则(ISP)
    java设计模式之开放关闭原则(OCP)
    java设计模式之迪米特法则(LoD)
    java设计模式之单一职责原则(SRP)
    android点滴(25)之 originalpackage
    VC 注册表操作
    java设计模式之依赖倒置原则(DIP)
    DFT 离散傅里叶变换 与 补零运算
    序列循环移位
  • 原文地址:https://www.cnblogs.com/blog411032/p/8994978.html
Copyright © 2011-2022 走看看