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> leafssList = new ArrayList>();//该静态变量用于添加信息中的叶子节点
    /**
     * 通过递归得到医疗服务分类信息中的叶子节点信息
     * @param basMstList
     * @param parentId
     * @return
     */
    public List> leafList1(List> basMstList,
            int parentId) {
        List leafsList = new ArrayList<>();
        for (Map basMstMap : basMstList) {
            int menuId = Integer.parseInt(( basMstMap.get("id")).toString());
            int pid = Integer.parseInt(( basMstMap.get("parentId")).toString());
            if(parentId==pid){
                List> leafLis = leafList1(basMstList,menuId);
                if(leafLis.isEmpty()){
                    leafsList.add(basMstMap);//递归后返回值到leafLis后判断该节点后续节点是否有值,据此保存后续节点为空也就是叶子节点的信息
                    leafssList.add(basMstMap);//保存信息到静态变量中
                }
            }
        }
        return leafsList;
    }
    /**
     * 返回信息叶子节点的信息
     */
    public List> leafList (List> basMstList,
            int parentId){
        leafList1(basMstList,parentId);
        return leafssList;
    }
//costItemDao中sql查询
public List> queryBasMediservicetype() {
        List> 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> leafList (List> basMstList,
            int parentId){
        leafssList.removeAll(leafssList);
        leafList1(basMstList,parentId);
        return leafssList;
    }

你可能感兴趣的:(java,数据库,json,java)