查询树型菜单数据
类似与下图的数据
实体类
// 实体类中需要一个 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;
}
这个方法算是优化了一点的它不需要进多次数据库。有一个更简单的方法,就是递归的去查询。但这样进数据库次数多会更多的消耗资源。