springboot构造树形结构数据并查询的方法

yizhihongxing

我会为你讲解“springboot构造树形结构数据并查询的方法”的完整攻略,以下是步骤:

1.引入依赖

首先,在pom.xml文件中引入mybatis-plusfastjson依赖,用于操作数据库和处理Json数据。具体依赖如下:

<dependencies>
    <dependency>
        <groupId>com.baomidou.mybatisplus</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>
</dependencies>

2.构造树形结构数据

接下来,我们需要将数据库中的数据转换成树形结构数据。假设我们有以下数据表:

CREATE TABLE `tb_menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `menu_name` varchar(100) NOT NULL COMMENT '菜单名称',
  `order_num` int(11) DEFAULT NULL COMMENT '排序号',
  `parent_id` int(11) DEFAULT NULL COMMENT '父级菜单ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

我们可以使用以下代码将数据表中的数据转换成树形结构数据:

@Service
public class MenuService {
    @Autowired
    private MenuMapper menuMapper;

    public List<MenuNode> buildMenuTree() {
        List<Menu> menuList = menuMapper.selectList(null);

        // 将所有Menu对象转换成MenuNode对象
        List<MenuNode> menuNodeList = menuList.stream()
                .map(MenuNode::new)
                .collect(Collectors.toList());

        // 将MenuNode对象添加到Map中,key为菜单ID
        Map<Integer, MenuNode> menuNodeMap = menuNodeList.stream()
                .collect(Collectors.toMap(MenuNode::getId, menuNode -> menuNode));

        // 遍历MenuNodeList,根据parent_id组合成树形结构
        List<MenuNode> menuTree = new ArrayList<>();
        for (MenuNode menuNode : menuNodeList) {
            if (menuNode.getParentId() != null) {
                MenuNode parentNode = menuNodeMap.get(menuNode.getParentId());
                if (parentNode != null) {
                    parentNode.addChild(menuNode);
                }
            } else {
                menuTree.add(menuNode);
            }
        }

        return menuTree;
    }
}

/**
 * 用于存储菜单节点信息的JavaBean
 */
@Data
public class MenuNode {
    private Integer id;
    private String menuName;
    private Integer orderNum;
    private Integer parentId;
    private List<MenuNode> children = new ArrayList<>();

    public MenuNode(Menu menu) {
        this.id = menu.getId();
        this.menuName = menu.getMenuName();
        this.orderNum = menu.getOrderNum();
        this.parentId = menu.getParentId();
    }

    public void addChild(MenuNode menuNode) {
        this.children.add(menuNode);
    }
}

以上代码的实现方式是将所有的菜单数据存储到JavaBean中,并通过将parent_idid属性进行关联,将菜单对象转换成树形结构数据。

3.查询树形结构数据

当我们需要查询菜单树时,我们可以使用以下代码:

@RestController
public class MenuController {
    @Autowired
    private MenuService menuService;

    @GetMapping("/menu")
    public String getMenu() {
        List<MenuNode> menuTree = menuService.buildMenuTree();

        // 将菜单树转换成Json格式返回
        return JSON.toJSONString(menuTree);
    }
}

当我们访问/menu接口时,会返回格式化后的Json数据,如下所示:

[
  {
    "id": 1,
    "menuName": "系统管理",
    "orderNum": 1,
    "parentId": null,
    "children": [
      {
        "id": 2,
        "menuName": "用户管理",
        "orderNum": 1,
        "parentId": 1,
        "children": []
      },
      {
        "id": 3,
        "menuName": "角色管理",
        "orderNum": 2,
        "parentId": 1,
        "children": []
      }
    ]
  },
  {
    "id": 4,
    "menuName": "采购管理",
    "orderNum": 2,
    "parentId": null,
    "children": [
      {
        "id": 5,
        "menuName": "采购订单",
        "orderNum": 1,
        "parentId": 4,
        "children": []
      },
      {
        "id": 6,
        "menuName": "采购入库",
        "orderNum": 2,
        "parentId": 4,
        "children": []
      }
    ]
  }
]

接下来,我再提供一条示例,用于查询菜单树中某个节点的所有子节点信息。

@Service
public class MenuService {
    @Autowired
    private MenuMapper menuMapper;

    public List<MenuNode> buildMenuTree() {
        // 以下为构造菜单树的代码,此处省略......
        // ...

        // 返回完整的菜单树
        return menuTree;
    }

    public List<Menu> getSubMenu(int menuId) {
        List<Menu> subMenuList = new ArrayList<>();
        List<MenuNode> menuTree = buildMenuTree();

        handleSubMenu(menuTree, menuId, subMenuList);

        return subMenuList;
    }

    private void handleSubMenu(List<MenuNode> menuNodes, int menuId, List<Menu> subMenuList) {
        for (MenuNode menuNode : menuNodes) {
            if (menuNode.getId().equals(menuId)) {
                subMenuList.addAll(menuNode.getChildren().stream().map(MenuNode::convertToMenu).collect(Collectors.toList()));
            } else {
                handleSubMenu(menuNode.getChildren(), menuId, subMenuList);
            }
        }
    }
}

以上代码中,getSubMenu方法用于查询菜单树中某个节点的所有子节点信息。我们首先调用buildMenuTree方法,获取完整的菜单树。然后,我们通过递归遍历菜单树,获取目标节点的所有子节点信息,并保存到subMenuList变量中。最后,我们将子节点信息返回即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot构造树形结构数据并查询的方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题

    使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题的攻略如下: 问题背景 在Flex与Java之间利用HTTPService传递XML数据时,使用默认的XML序列化方式会出现一些问题,如XML节点命名空间不正确、XML属性无法正确映射等。为了解决这些问题,我们可以使用asx3m和xstream这两个工具配合使…

    Java 2023年6月15日
    00
  • Java异常(Exception)处理以及常见异常总结

    关于Java异常处理以及常见异常总结的攻略共分为以下几个部分: 异常概念 Java异常分类 异常处理 常见异常总结 示例说明 1. 异常概念 Java异常是在程序执行期间出现的错误或异常情况。异常在程序执行过程中会中断程序的正常执行,并且在出现问题的位置抛出异常信息。一个方法如果没有特殊处理异常的机制,当出现异常时会使程序崩溃。 2. Java异常分类 Ja…

    Java 2023年5月26日
    00
  • Java的Hibernate框架中的双向主键关联与双向外键关联

    Java的Hibernate框架提供了双向主键关联和双向外键关联两种关联方式,这两种方式有着各自特点和适合的场景。下面将分别对这两种关联方式进行详细解析,并给出相关示例。 双向主键关联 双向主键关联是指关联关系中两个实体类都具有主键,并且相互之间通过持有对方主键的引用来建立关联。双向主键关联可以通过@MapsId和@ManyToOne注解来实现,在Java中…

    Java 2023年5月19日
    00
  • Knife4j 3.0.3 整合SpringBoot 2.6.4的详细过程

    下面是 “Knife4j 3.0.3 整合 SpringBoot 2.6.4 的详细过程”: 首先,需要确保我们的项目中已经添加了 SpringBoot 2.6.4 的依赖。可以在 pom.xml 文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId…

    Java 2023年5月19日
    00
  • SpringMVC实现文件上传和下载功能

    SpringMVC实现文件上传和下载功能 Spring MVC提供了很好的机制来实现文件上传和下载功能,但需要借助一些依赖包和配置设置。 1. 添加MultipartResolver Bean 在Spring MVC应用中,我们需要添加一个MultipartResolver Bean以处理文件上传的请求。MultipartResolver 接口定义了文件上传…

    Java 2023年6月15日
    00
  • springboot使用spring-data-jpa操作MySQL数据库

    下面是使用Spring Boot和Spring Data JPA操作MySQL数据库的完整攻略: 第一步:创建Spring Boot项目 我们可以使用Spring Initializr创建一个新的Spring Boot项目。在创建项目时,勾选“Spring Web”和“Spring Data JPA”两个选项,这样Spring Boot就会自动添加相关依赖。…

    Java 2023年5月20日
    00
  • Java 中实现随机无重复数字的方法

    实现随机无重复数字的方法,在 Java 中可以通过以下步骤来实现: 创建一个包含指定数字的列表。 使用 Collections 类的 shuffle() 方法来打乱数字的顺序。 从列表中取出前几个数字。 下面是一个示例代码,展示了如何实现随机无重复数字的方法: import java.util.ArrayList; import java.util.Coll…

    Java 2023年5月26日
    00
  • SpringSecurity构建基于JWT的登录认证实现

    SpringSecurity构建基于JWT的登录认证实现 本文将介绍如何使用SpringSecurity框架,在基于JWT的前后端分离应用中,实现登录认证功能。 准备工作 在开始介绍实现方案之前,我们需要准备好以下工具和环境: JDK 8 及以上版本 Maven 及其配置 Spring Boot Spring Security JWT Step 1: 创建项…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部