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

我会为你讲解“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日

相关文章

  • Mybatis批量修改的操作代码

    下面我将详细讲解Mybatis批量修改的操作代码的完整攻略。 什么是Mybatis批量修改操作 Mybatis批量修改操作是指在一次数据库连接的情况下,通过一条SQL语句同时修改多条数据的操作,相对于单条SQL语句修改单个数据,批量修改操作在实际应用中更加高效。 Mybatis批量修改操作的实现方式 Mybatis批量修改操作的实现方式有两种:第一种是基于f…

    Java 2023年5月19日
    00
  • Oracle下的Java分页功能_动力节点Java学院整理

    Oracle下的Java分页功能_动力节点Java学院整理 在Web开发中,分页是非常常见的功能需求。本文将介绍如何在Oracle数据库中使用Java实现分页功能。 1. 实现思路 通过查询获取数据总数及相应的数据,计算出总页数,然后根据当前页大小和页码去查询相应的数据。 2. 具体实现 定义分页参数类PageInfo 我们定义一个分页参数类PageInfo…

    Java 2023年6月15日
    00
  • Java JSON转成List结构数据

    下面我将详细讲解Java中如何将JSON转成List结构数据的完整攻略。 环境准备 首先需要引入相关依赖包,可以使用Maven管理依赖,将以下代码添加到项目根目录下的pom.xml文件中: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

    Java 2023年5月26日
    00
  • java如何从地址串中解析提取省市区(完美匹配中国所有地址)

    下面是Java如何从地址串中解析提取省市区的攻略: 一、准备工作 导入相关工具包。这里我们会用到commons-csv和commons-lang3这两个工具包。可以用Maven或Gradle自动化地导入。 下载地址库。可以从国家统计局官网下载最新的地址数据库,也可以从GitHub上下载已经格式化好的CSV格式地址库。 将地址库导入内存中的Hash表中,便于地…

    Java 2023年5月20日
    00
  • ibatis学习之搭建Java项目

    下面是关于“ibatis学习之搭建Java项目”的完整攻略: 第一步:项目环境搭建 在开始使用ibatis进行Java开发之前,我们首先需要搭建好开发环境,包括: 安装JDK环境:首先需要安装Java Development Kit(JDK),并配置好环境变量。 安装Eclipse IDE:选择一个常用的IDE,如Eclipse IDE,安装并配置好开发环境…

    Java 2023年5月19日
    00
  • Java Switch对各类型支持实现原理

    Java Switch语句是一种用于多路分支的选择结构,可以根据不同的值进行分支判断。它可以对各种数据类型进行支持,包括但不限于整型、字符型、字符串型、枚举型等,本篇攻略将为你详细讲解Java Switch对各类型支持的实现原理。 1. 整型 在Java Switch语句中,整型是最基本的数据类型之一,因此Java对其的支持也是最完善的。实现原理是通过对整型…

    Java 2023年5月26日
    00
  • Apache Log4j2 报核弹级漏洞快速修复方法

    下面是Apache Log4j2报核弹级漏洞快速修复方法的详细攻略: 概述 Apache Log4j2是一个广泛使用的Java日志框架,近日被爆出一个核弹级的漏洞CVE-2021-44228。攻击者在网络上可以通过构造Payload,远程执行任意代码,进行拦截、篡改和窃取敏感信息等攻击。此次漏洞严重性极高,Apache官方已经发布了修复方案,建议尽快进行修复…

    Java 2023年5月19日
    00
  • JSP开发入门(一)–安装好你的机器来使用JSP

    一、安装JDK 1.1 下载与安装JDK 首先,我们需要下载安装Java Development Kit(JDK)。JDK是Java应用程序的基本开发工具,它包括了Java运行时环境(JRE),Java编译器,Java API文档和其他一些实用工具。JDK的下载地址为: https://www.oracle.com/java/technologies/jav…

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