查询树型菜单数据

查询树型菜单数据

类似与下图的数据
在这里插入图片描述
在这里插入图片描述
实体类

// 实体类中需要一个 list<>集合来装子节点数据
@ApiModelProperty(value = "子节点数据")
private List<MenuVO> list = new ArrayList<>();

service层方法

// 查询方法我是Mybatis puls,但因为我刚用有些不熟练所以就用的是自定义得查询方法
// 查询方法看你自己的框架。
    /**
     * 菜单集合
     * @param name 菜单的名字
     * @param platformId 平台的id
     * @return
     * @throws Exception
     */
public List<MenuVO> listMenu(String name, Integer platformId) throws Exception {
//获取平台所有菜单
        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
        // eq 等于的意思
        // 这个对象(表)的 PlatformId = platformId
        menuQueryWrapper.lambda().eq(Menu::getPlatformId,platformId);
        // orderByAsc 这是按照"seq"倒序   orderBy 排序
        menuQueryWrapper.orderByAsc("seq");
        // 执行sql进入数据库查询
        List<MenuVO> listMenu = ConvertUtils.sourceToTarget(menuDao.selectList(menuQueryWrapper),MenuVO.class);

        // 根据父id 分组
        Map<Integer, List<MenuVO>> mapMenu = listMenu.stream().collect(Collectors.groupingBy(p -> p.getParentId()));

        // 当 根据菜单名查询时
        if(StringUtils.isNotBlank(name)){
            // 查询出叫某个名字的菜单
            List<MenuVO> menuVOS = menuDao.inquireMenu(name, platformId);
            for (MenuVO menuVO : menuVOS) {
                // 当有这个菜单时就进行 递归
                if(menuVO !=null){
                   // 设置它的下级。 注:它的id就是它下级菜单中的 上级菜单id   , mapMenu是分好组的所有菜单;
                    menuVO.setList(getChildLst(menuVO.getMenuId(), mapMenu));
                }
            }
            return menuVOS;
        }
        // 当不用按某个条件查询时  注:最上级的菜单也是有上级菜单id的,它们的上级id为0。所以上级id传入0
        return getChildLst(0, mapMenu);
}
    /**
     * 构建树状结构
     * @param id
     * @param sourceData
     * @return
     */
    private List<MenuVO> getChildLst(Integer id, Map<Integer, List<MenuVO>> sourceData) {
        // 获取这个id下  的菜单
        List<MenuVO> list = sourceData.get(id);
        // 等于空时也就是这个id下没有菜单时返回一个 空list;
        if(list == null) {
            return new ArrayList<MenuVO>();
        }
        // 这个id下有值  便进行递归来获取这个菜单下的下级数据
        for (MenuVO data : list) {
            // 遍历这个集合  获取这个他的下级菜单
            List<MenuVO> childList = sourceData.get(data.getMenuId());
            if(childList != null) {
                // 这个菜单有下级时设置给 list,并递归
                data.setList(getChildLst(data.getMenuId(), sourceData));
            }
        }
        return list;
    }

这个方法算是优化了一点的它不需要进多次数据库。有一个更简单的方法,就是递归的去查询。但这样进数据库次数多会更多的消耗资源。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值