Java递归获取树父节点下的所有树子节点

1、实体类中添加集合属性

private List<xxx> children=new ArrayList<>();

一定要=new ArrayList<>(); 否则就等于该children没有引用,忘里面添加数据的时候会空指针的。

2、dao层中有查询所有一级节点的方法

<select id="findParentList" resultType="xxx">
SELECT
  id,parent_id,code,name,xxx...
from
  xxx
where
    parent_id is null
</select>

比如这张表,一级节点的parent_id默认为null.

3、service中添加如下代码

private List<xxx> treeList = new ArrayList<>();  //全局变量

@Override
public List<xxx> getTree() {
    //先获取到所有数据
    treeList=xxxMapper.getList();   
    if(treeList==null) return null;

    //获取到所有一级节点
    List<xxx> parentList = this.xxxMapper.findParentList();
    List<xxx> list = new ArrayList<>();
    if(parentList != null){
        for (int i = 0; i < parentList.size(); i++) {
            list.add(recursiveTree(parentList.get(i).getId()));
        }
    }
    return list;
}


/**
 * 递归算法解析成树形结构
 * @param cid
 */
public xxx recursiveTree(Integer cid) {
    xxx node = getXxxById(cid);
    List<xxx> childTreeNodes  = getChildTreeById(cid);
    for(xxx child : childTreeNodes){
        xxx n = recursiveTree(child.getId());
        node.getChildren().add(n);
    }
    return node;
}

/**
 * 根据CID查询节点对象
 */
public xxx getXxxById(Integer cid){
    Map map =  getTreeMap();
    return (xxx) map.get(cid);
}

/**
 * 一次性取所有数据,为了减少对数据库查询操作
 * @return
 */
public Map getTreeMap(){
    Map map =  new HashMap<Integer, xxx>();
    if(null != treeList){
        for(xxx d : treeList){
            map.put(d.getId(), d);
        }
    }
    return map;
}

/**
 * 根据父节点CID获取所有了节点
 */
public List<xxx> getChildTreeById(Integer cid){
    List<xxx> list = new ArrayList<>();
    if(null != treeList){
        for (xxx d : treeList) {
            if(null != cid){
                if (cid.equals(d.getParentId())) {
                    list.add(d);
                }
            }
        }
    }
    return list;
}

获取到属性结构后,如何在页面显示树形表格,详见:AngularJS树形表格 -- tree-grid标签

原文地址:https://www.cnblogs.com/VitoYi/p/7718260.html