`
huahongluo
  • 浏览: 36703 次
  • 性别: 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  
看了一下代码的实现,貌似只能实现二级关系,即:上下级,如果级别更多的话就不行了?

相关推荐

    sql查询某个parentid下的所有childid

    sql查询某个parentid下的所有childid

    用js到后台数据库查出的数据实现的动态树

    它下面的节点的parentId应该是它的id,这层下面的parentId则是这层的id,一次类推;3、需要注意的是这个isLeaf,如果是最终的子节点,那么这个isLeaf为1,这个节点上面的所有父节点的isLeaf都为0; 5、这几个字段名...

    根据ID,ParentID绑定treeview

    根据ID,ParentID绑定treeview生成树。

    全国行政区划表 包含树形结构 id name parentId格式

    自己整理的全国行政区划表,包含一个树形表格式为 id name parentId code格式

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

    数据库结构: 库名:test 表名:tree CREATE TABLE [dbo].[tree] ( [id] [int] IDENTITY (1, 1) NOT NULL , [parentid] [int] NOT NULL , [message] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL )

    java递归树结构.rar

    java 生成树结构的数据格式返回给前端。。这是demo最后生成的数据格式:[{"id":1,"name":"名字1","parentId":0,"children":[{"id":3,"name":"名字3","parentId":1,"children":[{"id":7,"name":"名字7","parentId":3,...

    全国省市区JSON,包含parentid

    树形结构,包含parentid,可直接传入ui组件显示 { "value": "120000", "label": "天津", "children": [ { "value": "120100", "label": "市辖区", "parentid": "120000", "children": [ { "value": "120101...

    省市区镇四级联动数据库(通过parent_id关联)

    之前用的都是三级联动!网上的资源较少于是最近花时间自己整理了一套。省市区镇四级联动数据库文件,导入数据库即可使用!上下级是通过pid相关联的!

    NFine数据库说明.docx

    NFine数据库说明 数据库名:NFineBase 表名:Sys_Area 行政区域表 序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明 1 F_Id varchar 50 0 是 否 主键 2 F_ParentId varchar 50 0 是 父级 3 F_...

    数据库设计指导规范.doc

    数据库设计指导规范 表和字段命名规范 表和字段命名的首字母大写,表必须要有主键,而且主键命名为Id,类型为varchar(3 6),因为在程序中我们是采用guid作为主键,注意:非主外键字段之外不得包含关键字 Id 外键...

    oracle数据库经典题目

    19.视图是一个表示表的数据的数据库对象,它允许用户从一个表或一组表中通过一定的查询语句建立一个“虚表”。 20.序列是一种可被多个用户使用的用于产生一系列唯一数字的数据库对象。尤其适合多用户环境中,可以...

    中国省市县三级联动数据库字典表

    本来是想免费的但是最低就是一分,相信大家也不在乎这一分,里面是一个中国省市县三级联动的SQL语句,字段包括 id , name , parentid ,使用方法大概介绍下,首先省的parentid 都为0,省那一栏查询所有parentid为0的...

    有关数据库SQL递归查询在不同数据库中的实现方法

    本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级 0 2 二级 1 3 三级 2 4 四级 3 SQL SERVER 2005查询方法: ...

    后台查询数据,在页面用树展示

    还需要注意的是,在后台查询数据,数据库字段里必须有TreeInfo实体类中的那几个字段,而且需要注意的是,最上面的节点的parentId必须是0,其下面的字节点的parentId必须是这个节点的id。如果不是最后一个节点(下面...

    C#递归树的生成级Treeview空间的应用实例源码

    //设定生成树的原始数据 void getdatable() { tblDatas.Columns.Add("groupid", Type.GetType("System.String")); tblDatas.Columns.Add("groupname", Type.GetType("System.String")); tblDatas.Columns.Add...

    rbac数据库设计.pdf

    rbac数据库设计 1 rbac数据库设计 RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中⼼进⾏访问控制分享⽜原创,分享⽜系列,分享⽜。rbac ⽤户⾓⾊权限资源表如 何设计呢?下⾯开始表的设计。...

    php无限分类方法类,包含了创建数据库及表

    一个php无限分类的例子,包含了创建数据库及表 本分类方法的优势: ...2,不使用递归查询,所有操作只需一条sql语句 3,所有数据在读取一次数据库后,在数组内进行分析处理,节省数据库服务器资源

    最新省市区县数据库

    最新省市区县数据库 DROP TABLE IF EXISTS `area`; CREATE TABLE `area` ( `codeid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, `parentid` varchar(20) DEFAULT NULL, `name` ...

    Java 将有父子关系的数据转换成树形结构数据

    一、数据库父子结构数据设计  大部分采用 parentId的形式来存储父id,并且只存储父id,祖父Id不存储。也可以添加存储层级级别或者层级关系等字段。 CREATE TABLE `t_resource` ( `id` varchar(255) NOT NULL ...

    2007行政区划码 excel 代码 全拼 parentid

    2007行政区划码 excel 代码 全拼 parentid

Global site tag (gtag.js) - Google Analytics