用递归调用函数来把存在父子级别的数据封装成一个树状结构

用递归调用函数来把存在父子级别的数据封装成一个树状结构对于菜单 以及省市区联动这种数据 要从数据库取出来传给前端 然后前端通过 ztree 之类的框架进行展示 那么这里我写了一个将数据库中的数据 转成 dto 的树状结构的工具方法 代码 这里用了 lombok 框架 所以需要导 lombok 依赖 dependency groupid org projectlombo groupid dependency

大家好,我是讯享网,很高兴认识大家。

对于菜单,以及省市区联动这种数据, 要从数据库取出来传给前端,然后前端通过ztree之类的框架进行展示,那么这里我写了一个将数据库中的数据,转成dto的树状结构的工具方法

 代码

这里用了lombok框架,所以需要导lombok依赖


讯享网

 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> </dependency>

讯享网

这样只需要一个@Data注解就可以省去getter和setter了
idea还需要加一个插件LomBok plugin

 1.数据库对应的实体类
讯享网package com.zgd.demo.entity; import lombok.Data; / * 菜单 * @author zgd */ @Data public class Menu { 
    private Integer id; private String name; private Integer parentId; private Integer level; public Menu(Integer id, String name, Integer parentId, Integer level) { this.id = id; this.name = name; this.parentId = parentId; this.level = level; } } 
2. menu的dto类
package com.zgd.demo.dto; import lombok.Data; import java.util.List; / * menu的dto类 * @author zgd */ @Data public class MenuDto { 
    private Integer id; private String name; private Integer parentId; private Integer level; private List<MenuDto> children; } 
4.工具类
讯享网package com.zgd.demo.util.bean; import com.zgd.demo.dto.MenuDto; import com.zgd.demo.dto.UserDto; import com.zgd.demo.entity.Menu; import com.zgd.demo.entity.User; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; / * 将数据库查出来的list数据抓成树状结构 * @author zgd */ public class List2TreeUtil { 
    / * 根级父ID */ private static final Integer ROOT_PARENT_ID = 0; / * 将普通的entity的集合转成存在树状结构的集合 * @param list * @return */ public static List<MenuDto> getDtoTreeList(List<Menu> list){ List<MenuDto> dtos = new ArrayList<>(); if (list == null || list.isEmpty()) { return dtos; } for (Menu menu : list) { if (ROOT_PARENT_ID.equals(menu.getParentId())){ //找到顶层目录 MenuDto menuDto = new MenuDto(); //将实体类的数据转成dto BeanUtils.copyProperties(menu,menuDto); //获取该实体类下的所有子级 dtos.add(findChildren(menuDto,list)); } } return dtos; } / * 获取dto类下面的所有子级,存到dto中的children中 * @param menuDto * @param list * @return */ private static MenuDto findChildren(MenuDto menuDto, List<Menu> list) { for (Menu menu : list) { if (menuDto.getId().equals(menu.getParentId())){ //此时menu是menuDto下的子级 if (menuDto.getChildren() == null){ menuDto.setChildren(new ArrayList<MenuDto>()); } MenuDto dto = new MenuDto(); BeanUtils.copyProperties(menu,dto); //递归 menuDto.getChildren().add(findChildren(dto,list)); } } return menuDto; } } 
 4.测试
package com.zgd.demo; import com.google.gson.Gson; import com.zgd.demo.entity.Menu; import com.zgd.demo.util.bean.List2TreeUtil; import jdk.nashorn.internal.runtime.linker.LinkerCallSite; import java.util.ArrayList; import java.util.List; / * 运行demo * @author zgd */ public class DemoTest { public static void main(String[] args) { Gson gson = new Gson(); List<Menu> list = new ArrayList<>(); list.add(new Menu(1,"顶级目录",0,1)); list.add(new Menu(2,"二级目录-a",1,2)); list.add(new Menu(3,"二级目录-b",1,2)); list.add(new Menu(4,"三级目录-a-a",2,3)); list.add(new Menu(5,"三级目录-a-b",2,3)); list.add(new Menu(6,"三级目录-a-c",2,3)); list.add(new Menu(7,"三级目录-b-a",3,3)); System.out.println(gson.toJson(List2TreeUtil.getDtoTreeList(list))); } } 

将打印出来的字符串进行格式化后
这里写图片描述

小讯
上一篇 2025-04-02 12:08
下一篇 2025-01-26 22:52

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/13610.html