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

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

有两个方法:

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就是顶部的节点了
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值