Java以及Sql語句獲取Tree型資料
阿新 • • 發佈:2020-12-10
1.首先是java程式碼實現樹形結構
1.1可以直接上程式碼,有一般遞迴和JAVA8 Stream新特性實現
private List<Department> children = new ArrayList<>();注意這個要new出來,不能直接寫成 private List<Department> children;不然JAVA8 Stream 方法會報空指標,可以試試!!!!!!!!!!
package com.example.demo.vo; import java.util.ArrayList; import java.util.List; publicclass Department { private Integer id; private String name; private Integer parentId; private List<Department> children = new ArrayList<>(); public List<Department> getChildren() { return children; } public void setChildren(List<Department> children) {this.children = children; } public Department(Integer id, String name, Integer parentId) { this.id = id; this.name = name; this.parentId = parentId; } public Integer getId() { return id; } public void setId(Integer id) {this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getParentId() { return parentId; } public void setParentId(Integer parentId) { this.parentId = parentId; } @Override public String toString() { return "Department{" + "id=" + id + ", name='" + name + '\'' + ", parentId=" + parentId + ", children=" + children + '}'; } }
package com.example.demo.vo; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class DeptTreeUtil { public static List<Department> initData(){ List<Department> departmentList = new ArrayList<>(); departmentList.add(new Department(1, "江蘇省", 0)); departmentList.add(new Department(2, "南京", 1)); departmentList.add(new Department(3, "無錫", 1)); departmentList.add(new Department(4, "湖北省", 0)); departmentList.add(new Department(5, "武漢市", 4)); departmentList.add(new Department(6, "武昌", 5)); departmentList.add(new Department(7, "漢口", 5)); departmentList.add(new Department(8, "漢陽", 5)); departmentList.add(new Department(9, "孝感市", 4)); departmentList.add(new Department(10, "雲夢縣", 9)); departmentList.add(new Department(11, "測試", 100)); return departmentList; } //遞迴方法一 java8新特性 public static List<Department> makeTree(List<Department> departmentList, Integer pId) { //子類 List<Department> children = departmentList.stream().filter(x -> x.getParentId() .equals(pId) ).collect(Collectors.toList()); //後輩中的非子類 List<Department> successor = departmentList.stream().filter(x -> !x.getParentId() .equals(pId) ).collect(Collectors.toList()); children.forEach(x -> { makeTree(successor, x.getId()).forEach( y -> x.getChildren().add(y) ); } ); return children; } //遞迴方法一 普通遞迴 public static void getChildList(List<Department> list,List<Department> rootList){ // 得到子節點列表 for (Department department : rootList){ List<Department> childRenList = new ArrayList<>(); for (Department department1 : list){ if(department.getId().equals(department1.getParentId())){ childRenList.add(department1); } } if(childRenList.size() > 0){ department.setChildren(childRenList); getChildList(list,childRenList); } } } }
controller層主要是便於介面測試看到json格式
package com.example.demo.controller; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.vo.Department; import com.example.demo.vo.DeptTreeUtil; @RestController public class TreeController { @RequestMapping("/getDeptTree") public Object testTree(){ //獲取部門資料 List<Department> list = DeptTreeUtil.initData(); //java8 Stream處理後的tree行結構資料 List<Department> tree = DeptTreeUtil.makeTree(list, 0); return tree; } @RequestMapping("/getDeptTree2") public Object getTree(){ List<Department> list = DeptTreeUtil.initData(); List<Department> rootList = new ArrayList<>(); //先獲取列表中parentId為0的根節點 for (Department department : list){ if(department.getParentId().equals(0)){ rootList.add(department); } } DeptTreeUtil.getChildList(list, rootList); return rootList; } }
測試結果可以用postman可以看到json各式如下,兩個介面都是一樣的結果:
[ { "id": 1, "name": "江蘇省", "parentId": 0, "children": [ { "id": 2, "name": "南京", "parentId": 1, "children": [] }, { "id": 3, "name": "無錫", "parentId": 1, "children": [] } ] }, { "id": 4, "name": "湖北省", "parentId": 0, "children": [ { "id": 5, "name": "武漢市", "parentId": 4, "children": [ { "id": 6, "name": "武昌", "parentId": 5, "children": [] }, { "id": 7, "name": "漢口", "parentId": 5, "children": [] }, { "id": 8, "name": "漢陽", "parentId": 5, "children": [] } ] }, { "id": 9, "name": "孝感市", "parentId": 4, "children": [ { "id": 10, "name": "雲夢縣", "parentId": 9, "children": [] } ] } ] } ]
2.然後在mySql語句其實也可以實現
2.1先建立表如下,當然這是ORACLE的語法,mysql需要些儲存過程,有需要可以自己去學學,目前我還不會,以後補上去
CREATE TABLE TBL_TEST ( ID NUMBER, NAME VARCHAR2(100 BYTE), PID NUMBER DEFAULT 0 ); #插入測試資料: 可以自己進行插入 #從Root往樹末梢遞迴 select * from TBL_TEST start with id=1 connect by prior id = pid #從末梢往樹ROOT遞迴 select * from TBL_TEST start with id=5 connect by prior pid = id