小型数据,比如标签,部门之类的,可以组织数据,成层状结构,一并返回前端,节省请求次数;
但是大型数据,比如省市区等等联动,如果一并返回组织好的数据,查询量大,页面多次刷新,恶意请求,放入缓存还可以,其实还可以将这种数据直接放到前台,与后台无光关

对一张有树形结构的表查询:

1.获取该表下的所有数据

2.将数据转换成Dto集合,对集合进行遍历,将每一层级的数据分组,可以根据parentId,也可以根据表中的层级字段level等,产生Map<String,List<Dto>>类型,可以根据给定一个level,返回该level下的节点(单纯的一层节点)

3.收集所有根节点,List<Dto>

4.将List<Dto>,Map<String,List<dto>>,level作为三个参数,设置递归算法

void recursive(List<dto> list,Map<String,List<Dto>> map,Stirng level){

  for(Dto dto:list){

  List<Dto> li = map.get(dto.getLevel());

  li集合的sort操作//对节点排序

  dto.setListdto(li);//树形结构

  recursive(li,map,dto.getLevel());

  }

}

实例:

//1.将所有数据根据level分组(也可以根据parentId分组),这个map(level,List<dto>)帮助我们,给定一个level,返回该level下的节点
//2.收集所有根节点
public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelList) {
if (CollectionUtils.isEmpty(deptLevelList)) {
return Lists.newArrayList();
}
// level -> [dept1, dept2, ...] Map<String, List<Object>>
Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create();
List<DeptLevelDto> rootList = Lists.newArrayList(); for (DeptLevelDto dto : deptLevelList) {
levelDeptMap.put(dto.getLevel(), dto);
if (LevelUtil.ROOT.equals(dto.getLevel())) {
rootList.add(dto);
}
}
// 按照seq从小到大排序
Collections.sort(rootList, new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
});
// 递归生成树
transformDeptTree(rootList, LevelUtil.ROOT, levelDeptMap);
return rootList;
} public void transformDeptTree(List<DeptLevelDto> deptLevelList, String level, Multimap<String, DeptLevelDto> levelDeptMap) {
for (int i = 0; i < deptLevelList.size(); i++) {
// 遍历该层的每个元素
DeptLevelDto deptLevelDto = deptLevelList.get(i);
// 处理当前层级的数据
String nextLevel = LevelUtil.calculateLevel(level, deptLevelDto.getId());
// 处理下一层
List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptMap.get(nextLevel);
if (CollectionUtils.isNotEmpty(tempDeptList)) {
// 排序
Collections.sort(tempDeptList, deptSeqComparator);
// 设置下一层部门
deptLevelDto.setDeptList(tempDeptList);
// 进入到下一层处理
transformDeptTree(tempDeptList, nextLevel, levelDeptMap);
}
}
} public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
};

//  public Comparator<DeptLevelDto> deptComparator = (x,y)->x.getSeq()-y.getSeq();

--------------------------java8版本-----------------------

public List<DeptLevelDto> deptListoTree(List<DeptLevelDto> collect) {

    if(CollectionUtils.isEmpty(collect)){
return Lists.newArrayList();
} //@1
List<DeptLevelDto> rootList = Lists.newArrayList();
rootList = collect.stream().filter(
x->x.getLevel().equals(LevelUtil.ROOT)
).collect(Collectors.toList()); //@2
Map<String, List<DeptLevelDto>> multiMap = collect.stream().collect(Collectors.groupingBy(
x -> x.getLevel(), Collectors.toList()
)); //对root排序:
Collections.sort(rootList,deptComparator);
transformDeptTree(rootList,LevelUtil.ROOT,multiMap);
return rootList;
//tip:@1和@2可以使用guava的multiMap,一个key对应多个value
} //递归生成树
public void transformDeptTree(List<DeptLevelDto> deptLevelList, String level, Map<String, List<DeptLevelDto>> levelDeptMap) { deptLevelList.stream().forEach(x->{
// 以该节点为父节点,寻找子节点集合
String childLevel = LevelUtil.calculateLevel(level, x.getId());
List<DeptLevelDto> child = levelDeptMap.get(childLevel); if(CollectionUtils.isNotEmpty(child)){//递归终止条件
Collections.sort(child,deptComparator);
x.setList(child);
transformDeptTree(child,childLevel,levelDeptMap);
}
}); }

crud树型结构数据的更多相关文章

  1. oracle 树型结构数据的查询

    Oracle中start by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 con ...

  2. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  3. Rafy 领域实体框架 - 树型实体功能(自关联表)

      在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...

  4. Mac:文件夹树型展示 tree

    目标: 想要在MAC的Terminal中查看文件夹中所有文件的树型结构及文件夹.文件树统计. 安装方法: 1.brew安装 官网:http://brew.sh/ brew是Mac中安装软件的神器,一定 ...

  5. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  6. RDIFramework.NET V2.7 Web版本升手风琴+树型目录(2级+)方法

    RDIFramework.NET V2.7 Web版本升手风琴+树型目录(2级+)方法 手风琴风格在Web应用非常的普遍,越来越多的Web应用都是采用这种方式来体现各个功能模块,传统的手风琴风格只支持 ...

  7. dzzoffice的树型结构用户管理设计

    在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...

  8. php实现无限级树型菜单(函数递归算法)

    首先到数据库取数据,放到一个数组,然后把数据转化为一个树型状的数组,最后把这个树型状的数组转为html代码.也可以将第二步和第三步合为一步. 详细如下:1.数据库设计:脚本如下:CREATE TABL ...

  9. VC中实现带有背景位图的树型控件

    当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C++编程爱好者来说,使用Visual C++MFC提供的树型控件(CTreeCtrl)本身就是一个难点, ...

随机推荐

  1. TP3.23 与Laypage 结合进行分页

    demo地址:http://tp.ytlwin.top 控制器 <?php namespace Home\Controller; use Think\Controller; class Inde ...

  2. linux下访问window的共享文件,在命令行实现方法

    1.挂载共享目录 mount -t cifs //192.168.0.1/aa  /tmp/export -o username=text,password=test //192.168.0.1/aa ...

  3. CentOS 端口映射

    一个合作单位给我创建了十几台虚拟服务器做支撑.但是只给负载均衡绑定了公网IP.由于这个支撑的服务需要测试和调优,经常要往服务器上传class或者修改数据库.为了方便操作,我打算在负载均衡服务器上做端口 ...

  4. Codeforces Round #541 (Div. 2)

    Codeforces Round #541 (Div. 2) http://codeforces.com/contest/1131 A #include<bits/stdc++.h> us ...

  5. 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件

    在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...

  6. 【转】python中的字符数字之间的转换函数

    int(x [,base ])         将x转换为一个整数     long(x [,base ])        将x转换为一个长整数     float(x )               ...

  7. DBCO

    实现SAP连接外部数据库 也可用SM30维护DBCON的内容 SAP提供了对原生sql的操作,主要有以下几个类组成: CL_SQL_STATEMENT - Execution of SQL State ...

  8. Django xadmin 根据登录用户过滤数据

    在adminx.py文件对应的的class中添加如下代码: def queryset(self): qs = super(taskAdmin, self).queryset() if self.req ...

  9. java_13.2 Object

    1.类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法 2.hashCode()方法 返回该对象的哈希值.一般情况下,该方法会根据对象的 ...

  10. listView 滑动时 滑到一半自动滑动到对应的位置

    package com.bi.demo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; impo ...