最近写了个菜单树,用到递归,其实没啥难度,就是捋清思路就行,在此做下简单记录下:
第一步:创建实体类
@Data
public class MenuTreeDto {
private String menuId;
private String menuName;
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<MenuTreeDto> childrenMenu;
}
简单实体类(由于结果中会出现子节点没有的情况,此时子节点会返回null,加上注解-对象为空时不序列化即可)
第二步:编写mapper等此处忽略
第三步:递归方法编写
private List<MenuTreeDto> getChildren(MenuTreeDto menuTreeDto) {
//根据父节点查询子节点
List<MenuTreeDto> poticeMenus = menuMapper.selectDto(menuTreeDto.getMenuId());
//子节点没有时,跳出递归(一定要有判断)
if (poticeMenus.size() > 0) {
MenuTreeDto dto = new MenuTreeDto();
for (int i = 0; i < poticeMenus.size(); i++) {
//封装子节点信息
dto.setMenuId(poticeMenus.get(i).getMenuId());
dto.setMenuName(poticeMenus.get(i).getMenuName());
List<MenuTreeDto> children = getChildren(dto);
if (children.size() > 0) {
//将查到的子节点封装
poticeMenus.get(i).setChildrenMenu(children);
}
}
}
return poticeMenus;
}
返回结果:
"data": [
{
"menuId": "06637afcb8034ed9a551d4665e0cc998",
"menuName": "文件夹B"
},
{
"menuId": "a7663374d0254eb5860c49267abb753d",
"menuName": "文件夹A",
"childrenMenu": [
{
"menuId": "03f3861c69a24ecb9b3b58fd869f987f",
"menuName": "文件夹Ac"
},
{
"menuId": "8e902704f18c4b1e974701547246a4ac",
"menuName": "文件夹Ab"
},
{
"menuId": "c09289e31bef44bb9030e1bacddc3131",
"menuName": "文件夹Aa",
"childrenMenu": [
{
"menuId": "49cb6fe73a5c40fdb467fd1f2573477c",
"menuName": "文件夹Aaa"
},
{
"menuId": "cae7917181164a8da6c79cef33b2d1ed",
"menuName": "文件夹Aab"
}
]
}
]
},
{
"menuId": "b43d93ed18464da288b7e6c539703a58",
"menuName": "文件夹C"
}
]