java--關於樹的資料庫查詢方法
阿新 • • 發佈:2019-02-10
本篇主要講了關於一個表存放樹的資料庫表的查詢方法:
利用JSON查詢:
首先從資料庫查詢該表的所有資訊:
public JSONArray fromatAll() {
JSONArray jsonArray = new JSONArray();
List<Map<String,Object>> regList=jdbcTemplate.queryForList("select id,name ,father_id as parentId from bas_mediservicetype");
for(Map< String,Object> map:regList){
jsonArray.add(map);
}
return jsonArray;
}
使用JSONArray物件遞迴遍歷得到樹:
public JSONArray treeMenuList(JSONArray menuList, int parentId) {
JSONArray childMenu = new JSONArray();
for (Object object : menuList) {
JSONObject jsonMenu = JSONObject.fromObject(object );
int menuId = jsonMenu.getInt("id");
int pid = jsonMenu.getInt("parentId");
if (parentId == pid) {
JSONArray c_node = treeMenuList(menuList, menuId);
jsonMenu.put("nodes", c_node);
childMenu.add(jsonMenu);
}
}
return childMenu;
}
最後呼叫:
JSONArray jsonArray =
costItemervice.treeMenuList(this.costItemDao.fromatAll(), 0);
利用LIst和Map物件只查詢葉子節點的資訊:
//costItemService中實現:
static List<Map<String,Object>> leafssList = new ArrayList<Map<String,Object>>();//該靜態變數用於新增資訊中的葉子節點
/**
* 通過遞迴得到醫療服務分類資訊中的葉子節點資訊
* @param basMstList
* @param parentId
* @return
*/
public List<Map<String, Object>> leafList1(List<Map<String, Object>> basMstList,
int parentId) {
List leafsList = new ArrayList<>();
for (Map<String,Object> basMstMap : basMstList) {
int menuId = Integer.parseInt(( basMstMap.get("id")).toString());
int pid = Integer.parseInt(( basMstMap.get("parentId")).toString());
if(parentId==pid){
List<Map<String, Object>> leafLis = leafList1(basMstList,menuId);
if(leafLis.isEmpty()){
leafsList.add(basMstMap);//遞迴後返回值到leafLis後判斷該節點後續節點是否有值,據此儲存後續節點為空也就是葉子節點的資訊
leafssList.add(basMstMap);//儲存資訊到靜態變數中
}
}
}
return leafsList;
}
/**
* 返回資訊葉子節點的資訊
*/
public List<Map<String, Object>> leafList (List<Map<String, Object>> basMstList,
int parentId){
leafList1(basMstList,parentId);
return leafssList;
}
//costItemDao中sql查詢
public List<Map<String, Object>> queryBasMediservicetype() {
List<Map<String, Object>> basMstList = jdbcTemplate.queryForList("select id,name ,father_id as parentId from bas_mediservicetype");
return basMstList;
}
//呼叫:
costItemService.leafList(costItemDao.queryBasMediservicetype(), 1)
測試顯示成功,但是重新整理頁面之後,再次呼叫該方法時leafsslist不是重新定義而是接著在後面增加資料,static改成private錯誤一樣。
然後我在方法中增加了一條remove語句
/**
* 返回資訊葉子節點的資訊
*/
public List<Map<String, Object>> leafList (List<Map<String, Object>> basMstList,
int parentId){
leafssList.removeAll(leafssList);
leafList1(basMstList,parentId);
return leafssList;
}