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;
    }
/** * 根据等级查询类目 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值