1. 程式人生 > >java--關於樹的資料庫查詢方法

java--關於樹的資料庫查詢方法

本篇主要講了關於一個表存放樹的資料庫表的查詢方法:
利用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;
    }