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;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下步骤在Java查询PostgreSQL数据库中的: 1. 首先,您需要连接到PostgreSQL数据库。您可以使用JDBC驱动程序来实现这一点。以下是一个示例代码片段: ```java String url = "jdbc:postgresql://localhost:5432/mydb"; String user = "myuser"; String password = "mypassword"; Connection conn = DriverManager.getConnection(url, user, password); ``` 2. 接下来,您需要编写SQL查询来获取的数据。以下SQL查询是一个示例: ```sql WITH RECURSIVE tree(id, name, parent_id, level, path) AS ( SELECT id, name, parent_id, 0, ARRAY[id] FROM mytable WHERE parent_id IS NULL UNION ALL SELECT c.id, c.name, c.parent_id, p.level + 1, p.path || c.id FROM mytable c JOIN tree p ON c.parent_id = p.id ) SELECT id, name, parent_id, level, path FROM tree ORDER BY path; ``` 此查询使用了递归公共表达式(WITH RECURSIVE),它将每个节点的ID、名称、父节点ID、级别和路径存储在结果集中。路径列是一个整数数组,其中包含每个节点的ID。您可以根据需要修改此查询以适应您的数据模型。 3. 在Java中执行查询并处理结果集。以下是一个示例: ```java PreparedStatement stmt = conn.prepareStatement(query); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); Integer parentId = rs.getInt("parent_id"); int level = rs.getInt("level"); Array path = rs.getArray("path"); // process node data here } rs.close(); stmt.close(); conn.close(); ``` 在此示例中,我们使用PreparedStatement执行SQL查询,并使用ResultSet迭代结果集中的每个节点。使用ResultSet的方法获取每个节点的ID、名称、父节点ID、级别和路径。您可以根据需要修改此代码以适应您的数据模型。 以上是在Java查询PostgreSQL数据库中的的基本步骤。根据您的具体需求,您可能需要在此基础上进行更多的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值