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标签