递归循环获取多层级目录

需求:实现一级,二级,三级...多层级目录菜单展示

建表:

CREATE TABLE `ImageMenu` (
  `menu_id` varchar(32) NOT NULL COMMENT '菜单id',
  `title` varchar(64) NOT NULL COMMENT '菜单名称',
  `parent_id` varchar(32) NOT NULL COMMENT '父类目录id',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `creator` varchar(32) DEFAULT NULL COMMENT '创建人',
  `remark` varchar(64) DEFAULT NULL COMMENT '备注',
  `children` varchar(100) DEFAULT NULL COMMENT '子级列表'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文件目录表'

模拟数据:

INSERT INTO ImageMenu(menu_id,title,parent_id,create_time,creator,remark,children) VALUES
	 ('001','一级父目录-1','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
	 ('001001','二级目录-1-1','001','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('001002','二级目录-1-2','001','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('001003','二级目录-1-3','001','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('002','一级父目录-2','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
	 ('003','一级父目录-3','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
	 ('003001','二级目录-3-1','003','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('003002','二级目录-3-2','003','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('004','一级父目录-4 ','0','2021-03-16 00:00:00','lrj','1级 目录',NULL),
	 ('004001','二级目录-4-1','004','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('004002','二级目录-4-2','004','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('004003','二级目录-4-3','004','2021-03-16 00:00:00','lrj','2级 目录',NULL),
	 ('004001001',三级目录-4-1-1','004001','2021-03-16 00:00:00','lrj','3级目录',NULL),
	 ('004001002','三级目录-4-1-2','004001','2021-03-16 00:00:00','lrj','3级目录',NULL);

创建实体类 menu.class,dao层mapper,不在赘述

逻辑实现:

 public DetailResponse queryImageList() {

        DetailResponse response = new DetailResponse();
        List<ImageMenu> data = imageMapper.selectList();

        List<ImageMenu> imageList = new ArrayList<>();

        for (ImageMenu imageMenu : data) {

            if (imageMenu.getParentId().equals("0")) {
                imageList.add(imageMenu);
            }
        }

        // 为一级菜单设置子菜单,getChild是递归调用的
        for (ImageMenu imageMenu : imageList) {

            imageMenu.setChildren(getChilde(imageMenu.getMenuId(), data));
        }

        response.setResult(GlobalResponseCode.SUCCESS);
        response.setData(imageList);
        return response;

    }



 private List<ImageMenu> getChilde(String fileSource, List<ImageMenu> rootList) {

        List<ImageMenu> childeList = new ArrayList<>();
        for (ImageMenu imageMenu : rootList) {

            if (imageMenu.getParentId().equals(fileSource)) {

                childeList.add(imageMenu);
            }
        }

        for (ImageMenu imageMenu : childeList) {

            imageMenu.setChildren(getChilde(imageMenu.getMenuId(), rootList));

        }
        if (childeList.size() == 0) {
            return null;
        }
        return childeList;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值