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日

相关文章

  • 如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )

    清理系统临时文件可以释放系统磁盘空间,提高系统性能,以下是不同编程语言的批量清理系统临时文件攻略以及示例代码。 C#: 获取临时文件路径 string tempPath = Path.GetTempPath(); 清空临时文件夹 DirectoryInfo tempDirectory = new DirectoryInfo(tempPath); foreac…

    Java 2023年5月19日
    00
  • java实现MD5加密算法的实例代码

    下面我为大家详细讲解“Java实现MD5加密算法的实例代码”的完整攻略: 什么是MD5加密算法 MD5是一种常见的密码加密算法,全称为Message-Digest Algorithm 5,用于确保信息传输完整性和一致性,广泛应用于数据加密、数字签名、口令加密等方面。MD5是一种不可逆的加密算法,它将任意长度的数据进行计算后得到一个128位的哈希值。相同输入的…

    Java 2023年5月19日
    00
  • Spring Boot使用Schedule实现定时任务的方法

    下面是详细的“Spring Boot使用Schedule实现定时任务的方法”的攻略: 一、概述 在Spring Boot中,我们可以使用Spring Scheduler实现简单的定时任务。Spring Scheduler是Spring框架中的一个轻量级、基于内存的定时任务框架,可以方便地实现定时任务。在本文中,我们将详细介绍如何在Spring Boot中使用…

    Java 2023年5月20日
    00
  • javascript es6的常用语法你知道吗

    JavaScript ES6 常用语法 ES6是JavaScript的一种标准,也被称为ECMAScript2015,它为JavaScript添加了很多新特性和语法。以下是ES6中常用的几种语法。 let & const 在ES6之前,我们只能使用var关键字来声明变量。而在ES6中,我们可以使用let和const关键字来声明变量。 let用来声明一…

    Java 2023年6月15日
    00
  • Spring纯Java配置集成kafka代码实例

    下面我将详细讲解如何使用Spring纯Java配置集成kafka,包括以下步骤: 添加依赖 配置Kafka 发送消息 接收消息 1. 添加依赖 首先,我们需要在项目的pom.xml中添加kafka相关的依赖,如下所示: <dependency> <groupId>org.springframework.kafka</groupI…

    Java 2023年5月19日
    00
  • SpringBoot整合kafka遇到的版本不对应问题及解决

    下面是关于“SpringBoot整合kafka遇到的版本不对应问题及解决”的完整攻略。 问题描述 在SpringBoot项目中,我们通过kafka实现消息的发送和接收,在整合kafka时,经常会遇到这样的问题,就是当我们在pom.xml文件中配置kafka依赖时,如果选择的版本不正确,就会引发一系列异常。 问题解决 在解决这个问题之前,首先需要了解kafka…

    Java 2023年5月20日
    00
  • Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    这里提供一种Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法,共分为以下几个步骤: 步骤一:导入必要的依赖库 Java的MD5加密算法和FTP传输需要用到两个依赖库:commons-codec和commons-net。所以,需要在Java项目中导入相应的依赖库,示例代码如下: <dependency> <groupId&gt…

    Java 2023年5月23日
    00
  • Java如何通过反射获取Constructor、Field、Method对象

    Java中的反射机制允许我们在运行时操作类、方法、属性等信息。获取Constructor、Field、Method对象是反射机制的基础操作,下面详细介绍Java如何通过反射获取Constructor、Field、Method对象的完整攻略。 获取Constructor对象 获取Constructor对象的过程需要通过Class对象的getConstructo…

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