`
huahongluo
  • 浏览: 38421 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

通过parentid作为Map主键迭代法只查询一次数据库就生成树

阅读更多
     树迭代通常会通过子parentid等父的id的方式生成树。所以,生成树的时候通常动态去用上一级的id去找下一级的parentid。这样要经过多次数据库查询才能把树展示出来,效率比较低。
     可以一次把所有节点parentid作排序查询出来,将parentid相同的节点对象压入一个list,然后以parentid作为主键将list压入一个hashmap。然后通过从hashMap里获取顶端parentid的list开始遍历递归找每个节点的id作为主键的hashMap,hashMap里放放的就是他的子节点list。如果hashMap不含该主键则表明是根节点。

       /**
	 * 通过上级代号获取下级机构,加载机构树
	 * @param parentid      上级代号
	 * @return
	 */
	public DTO getProductOrganTree(DTO p_dto) throws Exception {
		DTO r_dto = new DTO();
		List list = null;
		
		String productid = (String) p_dto.get("productid");
		String userid = (String) p_dto.get("userid");
		
		list=(List)this.userDAO.queryhashmap("select * from v_organ order by parentid");
		
		Map<String, List> parentidMap = new HashMap();
		Map<String, String> containMap = new HashMap();
		
		String parentid = "";
		String lastparentid = "";
		List listorgan = null;
		for(Iterator it=list.iterator(); it.hasNext();)
		{
			
			Map map = (Map) it.next();
			parentid = map.get("parentid").toString();
			if(parentid==null||"".equals(parentid))
				parentid = "0";
			if(!lastparentid.equals(parentid))
			{
				if(listorgan!=null)
					parentidMap.put(lastparentid, listorgan);
				listorgan = new ArrayList();
				lastparentid = parentid;
			}
			listorgan.add(map);
		}
		parentidMap.put(lastparentid, listorgan);
		
		
		list=(List)this.userDAO.queryhashmap("select * from v_pou where userid='" + userid + "' and productid='" + productid + "'");
		for(Iterator it=list.iterator(); it.hasNext();)
		{
			Map map = (Map) it.next();
			containMap.put(map.get("organid").toString(), "");
		}
		
		String json = getTreeNodeJson(parentidMap,containMap,"0");
		
		r_dto.put("result",json);
		return r_dto;
	}
	
	/**
	 * 通过parentidMap 叠带树
	 * @param parentidMap
	 * @param parentid
	 * @return
	 */
	private String getTreeNodeJson(Map parentidMap,Map containMap,String parentid){
		StringBuilder builder = new StringBuilder("[");
		List list =  (List) parentidMap.get(parentid);
		for (int i=0; i < list.size(); ++i) {
			HashMap map = (HashMap)list.get(i);
			String id=map.get("id")==null ?"":map.get("id").toString().trim();
			String text=map.get("text")==null ?"":map.get("text").toString().trim();
			String iconcls="foler";
			
			if (builder.length() > 1)
				builder.append(","); 
			builder.append("{\"id\":\"").append(id).append("\"")
                   .append(",\"text\":\"").append(text).append("\"")
                   .append(",\"cls\":\"").append(iconcls).append("\"");
                   
            if(containMap.containsKey(id))
            {
            	builder.append(",\"checked\":").append(true);
            }
            else
            {
            	builder.append(",\"checked\":").append(false);
            }
			////////////////递规子类 start
			 if(parentidMap.containsKey(id))
			 {
				 builder.append(",\"children\":");
				 builder.append(getTreeNodeJson(parentidMap,containMap,id));
			 }
			 else
				 builder.append(",\"leaf\":true");
			////////////////递规子类 end
			builder.append("}");
			
		}
		builder.append("]");
		return builder.toString();
	}
分享到:
评论
2 楼 huahongluo 2013-04-25  
通过parentid可以遍历无限级的,你可以想像一个有根结点的hashmap。
1 楼 zzzz3621 2013-04-15  
看了一下代码的实现,貌似只能实现二级关系,即:上下级,如果级别更多的话就不行了?

相关推荐

    读取数据库 动态生成树节点

    最后,为了优化性能,可以考虑缓存节点数据,或者在数据库查询时直接获取层级关系,减少不必要的遍历。此外,还可以根据需求设置节点的展开和折叠状态,以及添加节点的点击事件等交互功能。 总的来说,动态生成`...

    TreeView 基于数据库动态生成树

    通过以上步骤,我们就成功地创建了一个基于数据库动态生成的树形视图,用于显示单表数据——部门组织结构。这个方法不仅适用于系统开发,而且可以根据需要扩展到其他类型的层次结构数据。在实际应用中,可能还需要...

    c#语言asp.net实现treeview控件读数据库动态生成树

    通过以上步骤,我们可以成功地使用 C# 和 ASP.NET 实现了一个从数据库中动态生成树形结构的 TreeView 控件。这个过程不仅涵盖了基本的数据获取和树形结构的构建,还包括了客户端脚本的使用以及样式的定制,为用户...

    Delphi 从数据库生成目录树

    在 Delphi 开发环境中,构建一个能够从数据库...总之,Delphi 的 TTreeView 组件结合数据库查询技术,可以轻松实现从数据库生成动态的目录树视图。通过理解和应用这些知识,开发者可以创建出强大且灵活的数据管理工具。

    php从数据库查询结果生成树形列表的方法

    本文将详细介绍如何使用PHP从数据库查询结果生成树形列表,并提供一个具体的示例。 首先,我们需要一个数据库来存储这些层级数据。在给出的示例中,使用了SQL(可能是PostgreSQL)来创建了一个名为`directory`的表...

    ExtJs 连接数据库并且生成动态树

    在“ExtJs 连接数据库并且生成动态树”这个主题中,我们将探讨如何利用ExtJs来连接后端数据库,并动态生成树形结构来展示数据。 首先,要实现ExtJs连接数据库,你需要一个服务器端的数据接口,它可以是基于PHP、...

    php数组生成树

    此函数会遍历给定的扁平数组,每次找到一个父ID匹配当前根节点的元素,就将其添加到树结构中,并递归地为其添加子节点。这样,我们可以得到一个无限深度的树结构。 使用这个函数,我们可以轻松地将`$flatArray`转换...

    C#利用 treeview生成树

    本篇将深入探讨如何利用C#和`TreeView`控件从数据库中读取数据并生成树形结构。 首先,我们需要理解`TreeView`控件的基本用法。`TreeView`控件由多个`TreeNode`对象组成,每个`TreeNode`代表树的一个节点,可以包含...

    动态树形菜单数据库表设计

    本文通过一个具体案例——树形菜单的数据表设计,阐述如何合理利用冗余数据来优化数据库结构,并讨论传统设计方案存在的不足之处。 #### 树形菜单设计背景 树形结构在计算机科学领域中有着广泛的应用,尤其是在...

    无限分类带数据库

    总结来说,这个"无限分类带数据库"的PHP实现提供了高效且灵活的分类管理功能,通过一次性的数据库查询构建整个分类树,降低了系统资源消耗,提升了用户体验。开发者可以根据具体需求,结合提供的`classok`类文件,...

    从数据库获取显示为树形菜单

    在Web开发中,将数据库中的数据以树形菜单的形式展示在页面上是一种常见的需求,尤其在网站导航、文件管理系统或组织结构展示等场景下。本文将深入探讨如何实现这一功能,主要关注三个关键点:从数据库获取数据、...

    sql查询某个parentid下的所有childid

    - **添加过滤条件**:可以通过WHERE子句添加更多的过滤条件,例如只查询某一层级的记录。 - **自定义显示列**:在SELECT子句中选择需要显示的列,可以根据实际需求定制输出格式。 - **使用其他函数**:结合其他...

    c# 根据数据库动态生成三层treeview导航

    在本场景中,我们关注的是如何根据数据库中的数据动态生成一个包含三层结构的TreeView控件。TreeView控件是Windows Forms中一个常用组件,它能够以树状结构展示数据,便于用户浏览和操作。 首先,我们需要理解“三...

    PHP连接Accesss数据库生成Tree

    4. **执行SQL查询**:一旦连接成功,你可以使用PDO对象的`query()`方法执行SQL查询,获取数据库中的数据。 接着,我们讨论如何将这些数据转换为树形结构。在PHP中,可以使用递归函数或者递归类方法来构建树结构。一...

    无限级树形菜单(Sql数据库)

    一种常见的方法是使用递归查询,通过自身连接多次来查找所有子节点。例如,可以使用`WITH RECURSIVE`语句(在支持的SQL版本中,如PostgreSQL、SQL Server 2005及以上)或者使用自连接和JOIN操作(在不支持递归的SQL...

    树形目录的递归实现数据库

    - **查询执行**:使用 `executeQuery` 方法时,会先建立数据库连接,然后创建一个 `Statement` 对象,并通过此对象执行 SQL 查询。 - **更新执行**:`executeUpdate` 方法也遵循类似的逻辑,但主要用于执行更新或...

    数据库中树形结构的设计1

    `ParentId`字段用于建立自连接,形成了一个树状结构,其中`CommentId`是主键,同时作为`ParentId`的外键引用,确保了数据的完整性。 在邻接表中,查询特定节点的所有后代(子树)曾经是一个挑战。传统的SQL查询需要...

    .net 动态生成树形图

    在.NET框架中,动态生成树形图是一种常见的需求,特别是在数据可视化、文件系统表示或组织结构展示等场景。本文将深入探讨如何利用递归方法和数据库交互来创建这样的树形结构。 首先,我们需要理解树形图的基本概念...

    Android之仿手机树形主键功能.zip

    在Android开发中,"树形主键"是一种特殊的数据结构设计,主要用于构建具有层级关系的数据模型,例如在文件系统、组织架构或者菜单导航等场景。它允许数据以树状的形式进行存储和检索,每个节点都有一个唯一的标识,...

    通过查询数据库,在.net中实现大类商品下嵌套小类商品

    一个商品类别表(Category)可以包含ID(主键)、Name(类别名称)、ParentID(父类别ID)等字段。ParentID为空的记录代表顶级类别(大类),非空的则表示子类别(小类)。通过ParentID字段,我们可以构建出类别间的...

Global site tag (gtag.js) - Google Analytics