最近写了个菜单树,用到递归,其实没啥难度,就是捋清思路就行,在此做下简单记录下:
第一步:创建实体类
@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"}]