精华内容
下载资源
问答
  • Java 数据库树形查询JAVA从数据库读取菜单,递归生成菜单树。定义菜单类public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate ...

    Java 数据库树形查询

    JAVA从数据库读取菜单,递归生成菜单树。

    feaee147b2c235e248017bd93a029693.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='菜单表';

    插入模拟数据

    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;

    }

    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进行个格式化后的对比。

    展开全文
  • 菜单在很多系统中都存在,然后在查询的时候确实很费事,如果使用后台代码逻辑去查询,会设计到递归等操作,频繁发起数据库连接,增加数据库压力。经过我多番研究发现mybatis可以实现菜单查询(包括多级);...

    树形菜单在很多系统中都存在,然后在查询的时候确实很费事,如果使用后台代码逻辑去查询,会设计到递归等操作,频繁发起数据库连接,增加数据库压力。经过我多番研究发现mybatis可以实现树形菜单查询(包括多级树);树形菜单如下:

    该图仅只有三级菜单,但是提供的方法可以做到多级菜单适用

    一、创建数据库表(略):

           具体表中要有   id和父id字段

    二、创建实体类:

           

    /**
     * 树形菜单类
     * @author 王 维
     * create time:2019年7月1日
     */
    public class catagoy implements Serializable {
    
    	private static final long serialVersionUID = 1L;
    	private  Integer id ;
    	/**
    	 * @TODO  这里省略树形中的其他属性,仅给出关键属性
    	 */
    	private Integer parentId;
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public Integer getParentId() {
    		return parentId;
    	}
    	public void setParentId(Integer parentId) {
    		this.parentId = parentId;
    	}
    	
    	
    }

    三、创建和菜单父类一样的子类,但是多一个子菜单属性,并继承父菜单:

    /**
     * 子菜单 -继承父类菜单实体类
     * @author 王 维
     * create time:2019年7月1日
     */
    import java.util.List;
    public class catagoyChild extends catagoy implements Serializable {
    	private static final long serialVersionUID = 1L;
    	/**
    	 * 子菜单  集合
    	 */
    	private List<catagoy> childCatatoyList;
    
    	public List<catagoy> getChildCatatoyList() {
    		return childCatatoyList;
    	}
    	public void setChildCatatoyList(List<catagoy> childCatatoyList) {
    		this.childCatatoyList = childCatatoyList;
    	}
    }
    

    四、编写mybatis mapper(仅给出关键代码):

      4.1:给出返回map:

         

    	<!-- 结果Map -->
    	<resultMap id="BaseResultMap" type="com.**.catagoyChild"><!-- 这里使用含子菜单的Bean-->
    		<result property="id" jdbcType="INTEGER" column="f_id"/>
    		<result property="parentId" jdbcType="INTEGER" column="f_parent__id"/>
            <!--这里使用mybatis  collection 进行集合查询  这是关键点-->
    		<collection property="childCatatoyList"  javaType="java.util.ArrayList" ofType="com.**.catagoyChild"
    		select="getChildLists" column="f_id">
    		</collection>
    	</resultMap>

    4.2:编写父查询-取出所有一级菜单(顶级);也是整个查询的入口和返回处,service调用此接口:

        

    	<select id="getAllCategory" resultMap="BaseResultMap">
    	    select * from t_pro_category where f_level=1  <!-- 这里level 表示属于第几级 -->
    	</select>

    4.3:编写关联集合查询-参数为父级菜单 id:

     

    	<select id="getChildLists" parameterType="String" resultMap="BaseResultMap">
    	    select * from t_pro_category where f_parent__id=#{id}  <!--父id=传过的id -->
    	</select>

    五、调用接口,返回所有分类。

    注意:该方法可能在超大数据第一次加载数据时有点慢,可以配合缓存Ehcache,在第一次查询时将数据加入缓存,这样后面的查询将会直接从缓存中读取。该方法纯属个人研究,如果不合理之处,请提意见。

    展开全文
  • 之前看到一位大佬的菜单树写法,但是找不到了,所以按着当时的理解编了一个查找菜单树,如果你还是一层层的套循环,那肯定没有这种炫酷 private ArrayList<Xiaolang> getTree(Long id, List<Xiaolang>...

    之前看到一位大佬的菜单树写法,但是找不到了,所以按着当时的理解编了一个查找菜单树,如果你还是一层层的套循环,那肯定没有这种炫酷

    private ArrayList<Xiaolang> getTree(Long id, List<Xiaolang> list) {
            //因为根节点可能有多个,所以我们用一个list存储没有父节点的根节点
            ArrayList<Xiaolang> returnList = new ArrayList<>();
            //使用map将list的数据存储到map中,方便下面使用,同时这个map也是整个代码的精华所在
            //map的key存储id,value存储对象
            HashMap<Long, Xiaolang> personMap = new HashMap<>();
            for (int i = 0; i < list.size(); i++) {
                Xiaolang person = list.get(i);
                personMap.put(person.getId(), person);
            }
        
            //现在开始一个个遍历我们的list列表,逐个加入到树中来
            for (int i = 0; i < list.size(); i++) {
                Xiaolang person = list.get(i);
                if (person.getParentId() == null) {
                    //如果没有父id,那他就是顶级树节点,就将它存在我们返回的列表中
                    returnList.add(person);
                } else {
                    //如果有父id,那他就是子节点
                    Long parentId = person.getParentId();
                    //树结构被打乱后处理(子树不进行连接)
                    if (personMap.get(parentId) == null) {
                        continue;
                    }
                    //我们去找本次循环元素的父元素,然后将子放在父下
                    if (personMap.get(parentId).getChildMap() == null) {
                        //此时我们是第一个连接在父节点下的子,新建对象并存储
                        TreeMap<Long, Xiaolang> map = new TreeMap<Long, Xiaolang>();
                        map.put(person.getId(), person);
                        personMap.get(parentId).setChildMap(map);
                        //将孩子放入到list里面
                        ArrayList<Xiaolang> list1 = new ArrayList<>();
                        list1.add(person);
                        personMap.get(parentId).setChildList(list1);
                    } else {
                        //此时我们不是第一个连接在父节点下的子,直接存储
                        personMap.get(parentId).getChildMap().put(person.getId(), person);
                        personMap.get(parentId).getChildList().add(person);
                    }
                }
            }
      
            //当指定了菜单树的id时候,我们会将该节点部分的数据返回过去
            if (id != null) {
                ArrayList<Xiaolang> sectionTree = new ArrayList<>();
                sectionTree.add(personMap.get(id));
                return sectionTree;
            }
            return returnList;
        }
    ​

    我们前端说不能接收map,所以我在其中加了个list。

    public class Xiaolang {
    ​
        private String personId;
    ​
        /**
         * 树查询的子map
         */
        private TreeMap<Long,Xiaolang> childMap;
    ​
    ​
        /**
         * 树查询的列表
         */
        private ArrayList<Xiaolang> childList;
    展开全文
  • 实体类代码: ... * 菜单编码 */ private String menuCode; /** * 菜单名称 */ private String menuName; /** * 排序 */ private Integer orderValue; /** * 父菜单id, 0 表示顶级菜

    实体类代码:

    @Data
    public class AcAppRoleMenuDto {
        /**
         * 菜单编码
         */
        private String menuCode;
    
        /**
         * 菜单名称
         */
        private String menuName;
    
        /**
         * 排序
         */
        private Integer orderValue;
    
        /**
         * 父菜单id, 0 表示顶级菜单
         */
        private Long parentId;
    
        /**
         * 角色名称
         */
        private String roleName;
    
        /**
         * 菜单id
         */
        private Long appMenuId;
    
        /**
         * 角色id
         */
        private Integer appRoleId;
    
        /**
         * 子节点
         */
        private List<AcAppRoleMenuDto> childrenList;
    }
    

    把list菜单转为Map

    /**
         * 把list菜单转为Map
         *
         * @param menuList 菜单树组装之前平级且乱序的菜单list
         * @return
         */
        private Map<Long, AcAppRoleMenuDto> listAcAppMenuToMap(List<AcAppRoleMenuDto> menuList) {
            //指定HashMap初始容量,减少扩容的次数,初始容量大小根据具体情况而定
            Map<Long, AcAppRoleMenuDto> map = new HashMap<>(3000);
            if (CollUtil.isNotEmpty(menuList)) {
                for (AcAppRoleMenuDto appMenuDto : menuList) {
                    //appMenuId必须是唯一的才可以作为map的key
                    Long appMenuId = appMenuDto.getAppMenuId();
                    if (appMenuId != null) {
                        map.put(appMenuId, appMenuDto);
                    }
                }
            }
            return map;
        }

    把菜单组装成一棵树

     /**
         * 把菜单组装成一棵树
         *
         * @param menuList
         * @return
         */
        private List<AcAppRoleMenuDto> treeAcAppRoleMenuDto(List<AcAppRoleMenuDto> menuList) {
            List<AcAppRoleMenuDto> menuDtoResultList = new ArrayList<>(3000);
            if (CollUtil.isNotEmpty(menuList)) {
                Map<Long, AcAppRoleMenuDto> menuDtoMap = this.listAcAppMenuToMap(menuList);
                for (AcAppRoleMenuDto appRoleMenuDto : menuList) {
                    Long appMenuId = appRoleMenuDto.getAppMenuId();
                    Long parentId = appRoleMenuDto.getParentId();
                    if (appMenuId != null && parentId != null) {
                        if (parentId == 0) {
                            menuDtoResultList.add(appRoleMenuDto);
                        } else {
                            AcAppRoleMenuDto appRoleMenuParent = menuDtoMap.get(parentId);
                            if (appRoleMenuParent != null) {
                                List<AcAppRoleMenuDto> childrenList = appRoleMenuParent.getChildrenList();
                                if (childrenList == null) {
                                    childrenList = new ArrayList<>();
                                    appRoleMenuParent.setChildrenList(childrenList);
                                }
                                childrenList.add(appRoleMenuDto);
                            }
                        }
                    }
                }
            }
            return menuDtoResultList;
        }

    把菜单树转为平级的list

     /**
         * 把树转为平级的list
         *
         * @param treeMenuList
         * @param menuList
         * @return
         */
        private List<AcAppRoleMenuDto> treeToLevelAcAppRoleMenu(List<AcAppRoleMenuDto> treeMenuList, List<AcAppRoleMenuDto> menuList) {
            if (CollUtil.isNotEmpty(treeMenuList)) {
                for (AcAppRoleMenuDto appRoleMenuDto : treeMenuList) {
                    menuList.add(appRoleMenuDto);
                    List<AcAppRoleMenuDto> childrenList = appRoleMenuDto.getChildrenList();
                    if (CollUtil.isNotEmpty(childrenList)) {
                        this.treeToLevelAcAppRoleMenu(childrenList, menuList);
                    }
                }
            }
            return menuList;
        }

    应用场景

    把菜单树转为平级的list 应用场景

    适用于同步自己系统的菜单到其他系统,或者把其他系统的菜单同步到自己的系统

    展开全文
  • 效果图:支持多级菜单菜单实体类:public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String url;// 菜单图标private String...
  • java递归查询菜单树

    2021-03-12 22:55:56
    //菜单主键自增IDprivate Integer menuPid;//菜单父ID,0为根目录private String menuLeafNode;//是否是叶子节点 1:是 0:否private String menuName;//菜单名称private String menuURL;//菜单URLpri...
  • 数据结构 代码/*** 查询所有分类及子分类 , 以形结构组装起来* @return*/public List listWithTree() {... 组装成父子的形结构// 2.1 找到所有的以及分类/*** Stream 是 Java8 中处理集合的关键抽象概念,它可以...
  • 首先看一下菜单的样子根据这个样子我们定义菜单类public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String url;// 菜单图标...
  • java实现菜单

    千次阅读 2021-09-05 10:30:53
    最近要做一个菜单接口,父菜单下面有子菜单,子菜单下面还有子菜单,要实现形结构返给前端。 数据表设计 CREATE TABLE `platform_menu` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单id', `menu_name...
  • 本篇暂不讲述前端,只讲述如何使用java8 的lamada表达式实现形数据的拼装 1、创建菜单表 CREATE TABLE `pms_category` ( `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id', `name` char(50) ...
  • java该怎么写左侧菜单树action中调取代码如下:publicStringlistValueStandard(){System.out.println("listValueStandard");Listtypes=basicNormService.getAllValueStandard();Listtrees=newArrayList();for(inti=0...
  • {"data": [{"id": 0,"menuName": "根节点","parId": -2,"type": 0,"url": "","children": [{"id": 1,"menuName": "1级节点1","parId": 0,"type": 0,"url": "","children": [{"id": 11,"menuName": "2级节点11",...
  • Service接口:/*** @Title: IVoteTreeService.java* @Package org.Service* @Description: TODO该方法的主要作用:* @author A18ccms A18ccms_gmail_com* @date 2017-5-6 下午10:42:10* @version V1.0*/package org....
  • /*** @Title: OpenSessionView.java* @Package org.util* @Description: TODO该方法的主要作用:* @author A18ccms A18ccms_gmail_com* @date 2017-5-6 下午1:48:25* @version V1.0*/package org.web;import java.io...
  • java实现递归菜单树

    2021-02-13 01:47:35
    本文实例为大家分享了java实现递归菜单树的具体代码,供大家参考,具体内容如下1.表结构SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for menu-- ----------------------------DROP...
  • } 这样写无法调取成功,下面是所调用的 实体类: public class ValueStandard implements java.io.Serializable { // Fields private Integer valueStandardId; private Integer parentId; private ...
  • 目前有一菜单列表,包含用户权限标识原始数据样子1.菜单1 (true)1.1 菜单1.1 (true)1.2 菜单1.2 (false)2.菜单2(true)2.1 菜单2.1(true)2.1.1 菜单2.1.1(true)2.2 菜单2.2(false)3.菜单3(false)3.1 菜单3.1(false)想...
  • Dao层接口:/*** @Title: IVoteTreeDao.java* @Package org.dao* @Description: TODO该方法的主要作用:* @author A18ccms A18ccms_gmail_com* @date 2017-5-6 下午10:38:47* @version V1.0*/package org.dao;...
  • } /** * 设置的子节点 * * @param actionBO * @param actions */ private void setChildNode(ActionBO actionBO, List actions) { List actionBOs = new ArrayList(); for (Action Action : actions) { if (!...
  • 通过DefaultMutableTreeNode类创建根节点、子节点和孙节点对象,再通过DefaultTreeModel类利用根节点创建模型对象,然后通过treeModel.insertNodeInto方法将节点对象插入模型中**/import java.awt.*...
  • Java树菜单的创建

    2021-02-12 16:37:11
    功能:实现创建一个菜单说明:创建菜单结构与创建菜单栏类似,是按层次与模型创建的。通过DefaultMutableTreeNode类创建根节点、子节点和孙节点对象,再通过DefaultTreeModel类利用根节点创建模型对象,...
  • `name` as label FROM gm_majortype where parentId=0 and levels=1 order by sort asc SELECT id,`name` as label FROM gm_majortype where parentId=#{value} order by sort asc 三、实现方法 List ...
  • 菜单树在web开发中我们经常会遇到菜单的问题,那么如何去实现一个菜单树呢?很多人可能第一反应就是递归,因为菜单是可能是无限级的,那么能不能不用递归就实现一个菜单树呢?要实现的效果图,如下:class ThreeBean...
  • 1.设计菜单实体importjava.util.List;public classMenu {//菜单idprivateLong id;//父节点idprivateLong parentId;//菜单名称privateString name;//对应路径privateString url;//图标privateString icon;//是否选中...
  • Java 类目形结构查询1. 初始化数据库1.1 类目表初始化2. 构建项目2.1 项目结构2.2 代码文件...
  • 需求一:这种不需要传任何参数一、数据库存储的菜单结果:parentid为0的都是根节点,也就是一级菜单,后面的子菜单的parentid为父菜单的ID。二、MenuDTO类(菜单类)的结构:@Datepublic class MenuDTO {private ...
  • java编程两种菜单结构的转换代码发布时间:2020-08-23 02:57:47来源:脚本之家阅读:56作者:zhangzeyuaaa首先看看两种菜单结构的代码示例。SingleTreeNode:package com.zzj.tree;public class ...
  • 这篇文章主要介绍了如何实现java递归 处理权限管理菜单树或分类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1.数据库表设计2.实体类设计package ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,879
精华内容 17,151
关键字:

java菜单树查询方法

java 订阅