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標簽