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日

相关文章

  • sprng和struts有什么区别?

    sprng和struts有什么区别? 背景介绍 sprng(简称Spring)和struts是两个常见的Java Web框架,都是基于MVC设计模式。它们都能帮助开发人员加快Web应用程序开发的速度。 区别 1. 关注点不同 Spring框架的主要关注点在于IoC(Inverse of Control,控制反转)和AOP(Aspect-Oriented Pr…

    Java 2023年5月20日
    00
  • 情人节写给女朋友Java Swing代码程序

    下面是详细的“情人节写给女朋友Java Swing代码程序”的攻略: 1. 确定编写目的 首先需要明确编写这个代码的目的是什么,是为了送给女朋友一份特殊的礼物,还是仅仅练习一些Java Swing编程技巧。这个目的确定好以后,就可以开始进入下一步。 2. 设计程序界面 Java Swing是一种操作系统无关的图形界面工具包,可以方便地实现各种界面。在这一步中…

    Java 2023年5月23日
    00
  • eclipse如何clean? java项目进行clean的技巧

    要进行clean操作,首先需要在Eclipse的菜单栏中找到“Project”选项,并在弹出菜单中选择“Clean”。 接下来,在弹出的窗口中选择需要clean的项目,并勾选“Start a build immediately”,最后点击“OK”按钮即可开始执行clean操作。 clean操作的主要作用是清理项目中的临时文件和缓存,以提高系统的稳定性和性能。…

    Java 2023年5月26日
    00
  • SpringBoot深入了解日志的使用

    Spring Boot 深入了解日志的使用 在本文中,我们将深入了解 Spring Boot 中日志的使用。我们将介绍 Spring Boot 中常用的日志框架,以及如何在应用程序中使用日志记录器。 Spring Boot 中常用的日志框架 Spring Boot 中常用的日志框架有以下几种: Logback:Logback 是一个基于 Java 的日志框架…

    Java 2023年5月15日
    00
  • Java前后端的JSON传输方式(前后端JSON格式转换)

    下面是针对Java前后端的JSON传输方式以及前后端JSON格式转换的完整攻略。 一、JSON格式简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON格式常用于Web应用程序之间的数据传输。 1.1 JSON格式规则 在JSON中,数据格式采用键值对的形式,键值…

    Java 2023年5月26日
    00
  • 常见的Java加密算法有哪些?

    常见的Java加密算法有以下几种:对称加密算法、非对称加密算法和散列算法。 对称加密算法 对称加密算法是指发送方和接收方使用相同的密钥对数据进行加密和解密。常见的对称加密算法有DES、3DES、AES、Blowfish等。 以AES算法为例,以下为使用步骤: 1)生成密钥 SecretKey secretKey = KeyGenerator.getInsta…

    Java 2023年5月11日
    00
  • Java编程探索之泛型擦除实例解析

    Java编程探索之泛型擦除实例解析 介绍 Java中的泛型在编译时期是可见的,但在运行时期并不存在,这被称为泛型擦除。本文将深入讲解Java中泛型擦除的实例,并且提供两个示例来解释泛型擦除的概念和实现原理。 泛型实现原理 Java中的泛型是通过编译时期的类型擦除实现的。编译器会将泛型类型的代码转换为普通的Java类并进行类型检查。在此过程中,泛型的具体类型被…

    Java 2023年5月26日
    00
  • 用java代码帮朋友P图

    下面是“用java代码帮朋友P图”的完整攻略: 准备工作 首先,我们需要安装并配置好Java开发环境。建议使用JDK1.8及以上版本,可以到Oracle官网下载并安装。安装完成后,需配置Java环境变量,具体可参考官方文档或搜索教程进行配置。 图像处理库 Java提供了许多用于图像处理的库,常用的有Java2D和JavaFX等。这里我们选择Java2D,它提…

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