广告
返回顶部
首页 > 资讯 > 精选 >springboot构造树形结构数据并查询的方法是什么
  • 877
分享到

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

2023-06-25 11:06:52 877人浏览 独家记忆
摘要

本篇内容主要讲解“SpringBoot构造树形结构数据并查询的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot构造树形结构数据并查询的方法是什么”吧!因为项目需要,页

本篇内容主要讲解“SpringBoot构造树形结构数据并查询的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习springboot构造树形结构数据并查询的方法是什么”吧!

因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。

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

我这里用的是springboot+mybatis-plus+mysql,示例的接口是查询一级权限以及二级权限、三级权限整个权限树…

下面是导入的Maven依赖

 <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>        </dependency><!--数据库连接-->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid-spring-boot-starter</artifactId>            <version>1.1.21</version>        </dependency>         <dependency>            <groupId>Mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency>        <!--mybatis增强工具-->        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-boot-starter</artifactId>            <version>3.4.0</version>        </dependency>  <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>cn.hutool</groupId>            <artifactId>hutool-all</artifactId>            <version>5.0.6</version>        </dependency>

下面是实体类Permission

@Datapublic class Permission implements Serializable {    @TableId    private String permissionId;    @NotNull(message = "权限名称不能为空")    private String permissionName;        @NotNull(message = "权限标识不能为空")    private String permissionCode;        @NotBlank(message = "父菜单ID不能为空")    private String parentId;        private String path;        private Integer sort;        private LocalDateTime createTime;        private LocalDateTime updateTime;        private String delFlag;    public Permission() {        this.permissionId = IdUtil.simpleUUID();    }

树形结点类

@Datapublic class Treenode {    protected String id;    protected String parentId;    protected List<TreeNode> children = new ArrayList<TreeNode>();    protected boolean hasChildren;   public void addTreeNode(TreeNode node){       children.add(node);   }}

树形结点详细信息类

@Data@EqualsAndHashCode(callSuper = true)public class PermissionTree extends TreeNode implements Serializable {    private String permissionName;    private String permissionCode;    private String path;    private Integer sort;    private String label;    private boolean hasChildren;    public PermissionTree() {    }}

构建树形结点工具类(关键),在这里我用@UtilityClass注解就表示这个类中的方法都是静态方法:

@UtilityClasspublic class TreeUtil {    public <T extends TreeNode> List<T> build(List<T> treeNodes, String root) {        List<T> trees = new ArrayList<>();        for (T treeNode : treeNodes) {            if (root.equals(treeNode.getParentId())) {                trees.add(treeNode);            }            for (T node : treeNodes) {                if (node.getParentId().equals(treeNode.getId())) {                    treeNode.addTreeNode(node);                    treeNode.setHasChildren(true);                }            }        }        return trees;    }        public List<PermissionTree> buildTree(List<Permission> permissionList, String root) {        System.out.println(Arrays.toString(permissionList.toArray()));        List<PermissionTree> treeNodeList = new ArrayList<>();        PermissionTree treeNode = null;        for (Permission permission : permissionList) {            treeNode = new PermissionTree();            treeNode.setId(permission.getPermissionId());            treeNode.setPermissionName(permission.getPermissionName());            treeNode.setPath(permission.getPath());            treeNode.setSort(permission.getSort());            treeNode.setParentId(permission.getParentId());            treeNode.setLabel(permission.getPermissionName());            treeNode.setHasChildren(false);            treeNodeList.add(treeNode);        }        return TreeUtil.build(treeNodeList, root);    }  }

响应消息主体类

@ToString@NoArgsConstructor@AllArgsConstructor@Accessors(chain = true)public class R<T> implements Serializable {private static final long serialVersionUID = 1L;private int code;private String msg;private T data;public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public static <T> R<T> ok() {return restResult(null, CommonConstants.SUCCESS, CommonConstants.MSG_SUCCESS);}public static <T> R<T> ok(T data) {return restResult(data, CommonConstants.SUCCESS, CommonConstants.MSG_SUCCESS);}public static <T> R<T> ok(T data, String msg) {return restResult(data, CommonConstants.SUCCESS, msg);}public static <T> R<T> failed() {return restResult(null, CommonConstants.FAIL, null);}public static <T> R<T> failed(String msg) {return restResult(null, CommonConstants.FAIL, msg);}public static <T> R<T> failed(T data) {return restResult(data, CommonConstants.FAIL, null);}public static <T> R<T> failed(T data, String msg) {return restResult(data, CommonConstants.FAIL, msg);}private static <T> R<T> restResult(T data, int code, String msg) {R<T> apiResult = new R<>();apiResult.setCode(code);apiResult.setData(data);apiResult.setMsg(msg);return apiResult;}}

数据查询接口mapper类

@Mapperpublic interface PermissionMapper extends BaseMapper<Permission>{    }

数据逻辑处理业务接口

public interface PermissionService extends IService<Permission> {          List<PermissionTree> treePermission(boolean lazy, String parentId);}

数据逻辑处理业务接口实现类

@Servicepublic class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {    @Override    public List<PermissionTree> treePermission(boolean lazy, String parentId) {        if (!lazy) {            return TreeUtil.buildTree(                    baseMapper.selectList(Wrappers.<Permission>lambdaQuery().orderByAsc(Permission::getSort)),                    CommonConstants.PERMISSION_ROOT_ID);        }        String parent = parentId == null ? CommonConstants.PERMISSION_ROOT_ID : parentId;        return TreeUtil.buildTree(                baseMapper.selectList(Wrappers.<Permission>lambdaQuery().eq(Permission::getParentId, parent).orderByAsc(Permission::getSort)), parent        );    }}

查询权限树请求接口类

@RestController@RequestMapping("/permission")public class PermissionController {    @Autowire    private PermissionService permissionService;        @RequestMapping(value = "/getTree", method = RequestMethod.GET)    public R getTree(boolean lazy, String parentId) {        return R.ok(permissionService.treePermission(lazy, parentId));    } }

表中测试数据如下(注意它的parent_id

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

测试一:不是懒加载,查询整个权限树。 结果如下。

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

{    "code": 0,    "msg": "SUCCESS",    "data": [        {            "id": "1",            "parentId": "-1",            "children": [                {                    "id": "2",                    "parentId": "1",                    "children": [                        {                            "id": "3",                            "parentId": "2",                            "children": [],                            "hasChildren": false,                            "permissionName": "update",                            "permissionCode": null,                            "path": null,                            "sort": 3,                            "label": "update",                            "owned": false                        },                        {                            "id": "4",                            "parentId": "2",                            "children": [],                            "hasChildren": false,                            "permissionName": "insert_role",                            "permissionCode": null,                            "path": null,                            "sort": 4,                            "label": "insert_role",                            "owned": false                        }                    ],                    "hasChildren": true,                    "permissionName": "delete",                    "permissionCode": null,                    "path": null,                    "sort": 2,                    "label": "delete",                    "owned": false                }            ],            "hasChildren": true,            "permissionName": "add",            "permissionCode": null,            "path": null,            "sort": 1,            "label": "add",            "owned": false        },        {            "id": "5",            "parentId": "-1",            "children": [],            "hasChildren": false,            "permissionName": "role:saveRole",            "permissionCode": null,            "path": "/role/saveRole",            "sort": 5,            "label": "role:saveRole",            "owned": false        }    ]}

测试二:是懒加载,根据parent_id查询当前分支。 结果如下。

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

{    "code": 0,    "msg": "SUCCESS",    "data": [        {            "id": "3",            "parentId": "2",            "children": [],            "hasChildren": false,            "permissionName": "update",            "permissionCode": null,            "path": null,            "sort": 3,            "label": "update",            "owned": false        },        {            "id": "4",            "parentId": "2",            "children": [],            "hasChildren": false,            "permissionName": "insert_role",            "permissionCode": null,            "path": null,            "sort": 4,            "label": "insert_role",            "owned": false        }    ]}

到此,相信大家对“springboot构造树形结构数据并查询的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: springboot构造树形结构数据并查询的方法是什么

本文链接: https://www.lsjlt.com/news/304545.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot构造树形结构数据并查询的方法是什么
    本篇内容主要讲解“springboot构造树形结构数据并查询的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot构造树形结构数据并查询的方法是什么”吧!因为项目需要,页...
    99+
    2023-06-25
  • springboot构造树形结构数据并查询的方法
    因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-pl...
    99+
    2022-11-12
  • MySQL查询树形结构数据的两种方法
    目录1. 递归查询2. 闭包表对于mysql查询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法: 1. 递归查询 使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_tab...
    99+
    2023-11-11
    MySQL查询树形数据 MySQL查询树形结构 MySQL树形结构查询
  • 数据库树形结构怎么查 四种方法解决
    使SQL实现树形查询 1 树形结构固定,即固定几层结构,可以采用数据库连接查询,这里以两张表为例: select one.id, one.label, two.id, two.labelfrom...
    99+
    2023-09-13
    数据库 sql java
  • Java 递归查询部门树形结构数据的实践
    说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1、数据库表:department 2、编写sql映射语句 &...
    99+
    2022-11-12
  • Java构建树结构的公共方法是什么
    这篇“Java构建树结构的公共方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java构建树结构的公共方法是什么”文...
    99+
    2023-07-06
  • mysql查询数据库下表结构的方法
    mysql查询数据库下表结构的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!方法:1、使用DESCRIBE命令以表格的...
    99+
    2022-10-18
  • Java二叉树的构造和遍历方法是什么
    今天小编给大家分享一下Java二叉树的构造和遍历方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目一 解...
    99+
    2023-06-29
  • LINQ to SQL构造数据库的方法是什么
    本篇内容主要讲解“LINQ to SQL构造数据库的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LINQ to SQL构造数据库的方法是什么”吧!LINQ to SQL概念什么是LI...
    99+
    2023-06-17
  • mysql查看表结构的方法是什么
    这篇“mysql查看表结构的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql查看表结构的方法是什么”文章吧...
    99+
    2023-07-02
  • MyBatis实现两种查询树形数据的方法详解(嵌套结果集和递归查询)
    目录方法一:使用嵌套结果集实现1,准备工作2,实现代码方法二:使用递归查询实现    树形结构数据在开发中十分常见,比如:菜单数、组织树, 利用&nbs...
    99+
    2022-11-12
  • sql查询并修改数据的方法是什么
    SQL查询和修改数据的方法是通过使用SQL语句来实现的。以下是一些常见的SQL查询和修改数据的方法:1. 查询数据:使用SELEC&...
    99+
    2023-09-13
    sql
  • Java并发数据结构的基石是什么
    这篇文章主要介绍了Java并发数据结构的基石是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java并发数据结构的基石是什么文章都会有所收获,下面我们一起来看看吧。线程阻塞原语Java 的线程阻塞和唤醒是通...
    99+
    2023-06-02
  • PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么
    这篇文章主要介绍“PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么”,在日常操作中,相信很多人在PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么问题上存在疑惑,...
    99+
    2023-06-21
  • kettle非结构化数据迁移的方法是什么
    非结构化数据迁移的方法因具体情况而异,以下是几种常用的方法:1. 手动复制:将原始数据手动复制到目标系统中。这种方法适用于数据量较小...
    99+
    2023-09-20
    kettle
  • Javascript常见数据结构的实现方法是什么
    这篇文章主要讲解了“Javascript常见数据结构的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Javascript常见数据结构的实现方法...
    99+
    2022-10-19
  • Java队列数据结构的实现方法是什么
    这篇文章主要介绍“Java队列数据结构的实现方法是什么”,在日常操作中,相信很多人在Java队列数据结构的实现方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java队列数据结构的实现方法是什么”的疑...
    99+
    2023-06-22
  • php查询数据库并显示的方法是什么
    在PHP中,可以使用以下步骤来查询数据库并显示结果:1. 连接数据库:使用`mysqli_connect()`函数或者`PDO`来连...
    99+
    2023-09-04
    php 数据库
  • mysql索引数据结构要用B+树的原因是什么
    这篇文章主要讲解了“mysql索引数据结构要用B+树的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql索引数据结构要用B+树的原因是什么”吧!1. Hash表?No因考虑到...
    99+
    2023-06-30
  • 数据库文件逻辑结构形式指的是什么
    本篇内容主要讲解“数据库文件逻辑结构形式指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库文件逻辑结构形式指的是什么”吧!数据库文件的逻辑结构形式是记录式文件。文件的逻辑结构可分为两...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作