数据库树形数据如何组装为后台树形数据结构

我是在写树形菜单时遇到的问题,树形数据在数据库中是一张表的自关联存储,在前台解析的的是树形的数据结构,就需要将查询的一条条数据包装为树形结构。

有两个方法:

1、一次查询一层,一层一层往下查,需要使用递归,这个网上例子很多,但是需要发太多查询,不是我想要的。
2、一次查出所有数据,自己拼装为树形结构

数据表结构:
menu_id , name , url , icon , parent_id , ordered

Java类

public class Menu {
    private String menuId;

    private String name;

    private String url;

    private String icon;

    private String parentId;

    private Integer ordered;

    private Boolean state;

    private List<Menu> children;
    /*
    get、set方法
    */

}

实现逻辑

/*
 * 首先数据库查询的时候最好按照ordered的大小排序,应该是越小的是父节点,越大的是子节点,按照降序排列
    也就是子级在上,才好用下面的方法:

    1、用查询数据给temp赋值

    Map<String, Menu> temp = new LinkedHashMap<String, Menu>();
    读取数据库数据,每次一条记录,相当于一个Menu对象
    每次都new 一个Menu,数据库赋值,并存储到temp中以ID为key,对象为Value
    此时的最低级别在temp顶部,最高级别在temp底部
    用LinkedHashMap是因为这个map是循坏是按存储顺序来迭代。

    2、循坏temp

    当temp赋值结束之后开始循坏temp,从最顶部也就是最低级别开始迭代
    判断该节点是不是顶级,如不是顶级就在temp中拿出父节点,设置父级的children.add,
    循环结束,最后,拿到temp的最后一个节点,就是最高节点,里面包含N多children
*/


    //将所有数据取出放进集合
    List<Menu> list = menuMapper.getAll();

    /*
     *  循环list拿出,每次一条记录,相当于一个Menu对象
     *  每次都new 一个Menu,数据库赋值,并存储到temp中以ID为key,对象为Value
     *  用LinkedHashMap是因为这个map是循坏是按存储顺序来迭代。
     */

    Map<String, Menu> temp = new LinkedHashMap<String, Menu>();
    for (Menu menu : list) {
        temp.put(menu.getMenuId(), menu);
    }
    //顶部节点
    Menu top = new Menu();

    //循环temp
    for (Menu menu : temp.values()) {
        //判断此节点是不是顶部(因为我的数据库的顶部节点的id是设为null)
        if(menu.getParentId() != null){
            //不是顶部节点,找到父级并给父级进行children.add方法
            Menu parent = temp.get(menu.getParentId());
            parent.getChildren().add(menu);

        }else{
            //已经循坏到顶部,添加子节点
            top.getChildren().add(menu);
        }
    }

//此时的top就是顶部的节点了
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很抱歉,作为AI语言模型,我无法直接与后台数据库交互,并生成树形列表。但是,我可以为您提供一个大致的思路和代码框架,供参考: 首先,您需要使用AJAX技术从后台数据库获取数据。以下是一个简单的示例代码: ``` var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var data = JSON.parse(this.responseText); // 在这里处理数据 } }; xhttp.open("GET", "your_api_url", true); xhttp.send(); ``` 在这里,您需要将your_api_url替换为您的后台API地址,以便从数据库中获取数据。这里使用了XMLHttpRequest对象来发送异步HTTP请求,并在请求完成后处理响应数据。 接下来,您需要将数据转换为树形结构。具体实现方式可以根据您的数据结构和需求而定。以下是一个简单的示例代码: ``` function arrayToTree(array, idAttr, parentAttr, childrenAttr) { var tree = [], lookup = {}; for (var i = 0, len = array.length; i < len; i++) { var item = array[i]; lookup[item[idAttr]] = item; item[childrenAttr] = []; } for (var i = 0, len = array.length; i < len; i++) { var item = array[i]; if (item[parentAttr] != null) { lookup[item[parentAttr]][childrenAttr].push(item); } else { tree.push(item); } } return tree; } ``` 在这里,您需要将array替换为您从后台数据库获取的数据。该函数会根据您指定的idAttr和parentAttr属性,将数组转换为树形结构,并返回树形结构的根节点数组。 最后,您需要将树形结构渲染为列表。以下是一个简单的示例代码: ``` function renderTree(tree, element) { var ul = document.createElement('ul'); for (var i = 0, len = tree.length; i < len; i++) { var li = document.createElement('li'); li.textContent = tree[i].name; if (tree[i].children.length > 0) { renderTree(tree[i].children, li); } ul.appendChild(li); } element.appendChild(ul); } ``` 在这里,您需要将tree替换为您转换后的树形结构,将element替换为您要渲染的DOM元素。该函数会递归地渲染树形结构为HTML列表。 综上所述,您需要将以上三段代码结合起来,才能实现从后台数据库读取数据,并生成树形列表的功能。当然,具体实现方式还需要根据您的具体情况进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值