java工程积累——树形结构的操作

最近一直被树形结构整的很头大,又是递归,又是循环,但是,好在我们在经历了千辛万苦后,终于弄出来了,其实就是组织机构的常规操作,有些是我们过度设计,有些是我们想错了,而对数的逻辑读取,我们就属于想错了的类型,今天拿出来和大家分享,主要是树形结构在数据库的读取问题!

原始:

在最开始,我们对树的查询,肯定是从最简单的select开始,我们现在回顾一下:

定义:

表名:tb_tree

字段:id(主键),title(标题),parentId(父节点id)

举例:

1、查找树中的所有顶级父节点(辈份最长的人)。 假设这个树是个目录结构,那么第一个操作总是找出所有的顶级节点,再根据该节点找到其下属节点。

select * from tb_tree m where m.parent is null;

2、查找一个节点的直属子节点(所有儿子)。 如果查找的是直属子类节点,也是不用用到树型查询的。

select * from tb_tree m where m.parent=1;

递归:

简介:

经过一段时间的维护,我们发现,当我们处理的逻辑复杂时,我们和数据库就会与多次交互,而这是不符合网络交互的现状的,我们还是希望,尽量通过一次交互,传递更多的信息,减少对带宽的压力,经过多方讨论,我们发现Oracle其实已经做了这个工作,我们一起来看看:

我们经过不断的探索,发现oracle树查询的最重要的就是select…start with…connect by…prior语法了。依托于该语法,我们可以将一个表形结构以树的顺序列出来。

1、start with id= 是定义起始节点(种子),可以是id也可以是root_id,定义为root_Id查询该节点下所有的树结构,定义为id(子节点)则查询指定的树

2、connect by prior :prior的含义为先前,前一条记录。prior id=root_id 也就是前一条记录的id等于当前记录的root_id(父id)

举例:

1、查找一个节点的所有直属子节点(所有后代)。

select * from tb_menu m start with m.id=1 connect by m.parent=prior m.id;

这个查找的是id为1的节点下的所有直属子类节点,包括子辈的和孙子辈的所有直属节点。

2、查找一个节点的直属父节点(父亲)。 如果查找的是节点的直属父节点,也是不用用到树型查询的。

--c-->child, p->parent
select c.id, c.title, p.id parent_id, p.title parent_title
from tb_menu c, tb_menu p
where c.parent=p.id and c.id=6

3、查找一个节点的所有直属父节点(祖宗)。

select * from tb_menu m start with m.id=38 connect by prior m.parent=m.id;

4、level字段为oracle特有的层级字段,可以通过level字段查询指定的层级

select root_id,id,name,level from t2 where level=1
 start with root_id = 0
connect by prior id = root_id;

总结:

通过这几天的观察,我们发现,集体的智慧永远是最强大的,每个人贡献一点点,我们就能将问题的解决方案在设计之初就升级到一个客观的程度,包括这次的树形结构的研究,相信你的队友不论他在你心理到底是什么状态,他既然被招进公司,肯定有他的闪光点打动了人力部门,且还有一句话,高手在民间,这句话,已经多次被验证了!

时间: 2024-10-13 04:49:18

java工程积累——树形结构的操作的相关文章

javaproject积累——树形结构的操作

近期一直被树形结构整的非常头大,又是递归.又是循环.可是,好在我们在经历了千辛万苦后.最终弄出来了.事实上就是组织机构的常规操作,有些是我们过度设计.有些是我们想错了.而对数的逻辑读取,我们就属于想错了的类型.今天拿出来和大家分享.主要是树形结构在数据库的读取问题! 原始: 在最開始.我们对树的查询,肯定是从最简单的select開始.我们如今回想一下: 定义: 表名:tb_tree 字段:id(主键),title(标题),parentId(父节点id) 举例: 1.查找树中的全部顶级父节点(辈份

《Java数据结构》树形结构

树形结构是一层次的嵌套结构. 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示.经典数据结构中的各种树形图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树. 左子树和右子树又有自己的子树. 结构图: 一切尽在代码中: import java.util.ArrayList; import java.util.List; public class TreeNode { private int age; // 节点属性,年龄 private String name

java工程积累——前台页面的统一校验

在项目中,我们面临这样的问题,就是如果在前台做抽象,大家想想后台代码的抽象,我们耳熟能详,但是前台的抽象,我们是如何做的呢?恐怕这个问题,如果是第一次抛给自己,自己也很惶恐,就是,我们不是对应一个业务写好一个页面吗?以前从来没有想过抽象,这里,我就要说,那是咱们最初级的方式,今天带大家一起见证先比较靠谱一种方式! 回顾 我们回顾下html编码的历程,在web1.0时代,我们面向的大多是静态页面,这时候,能够展示出来就好,由于网速的限制,电脑处理能力的约束,我们只能把什么都写在一起,但是随着时间的

java工程积累——项目管理:破窗理论

年后这段时间,我一直带着项目,在项目中,最后总会遇到这样那样的问题,搞得自己有些狼狈!在向我的恩师求助后,我翻阅了一些资料和书籍,最后找到了一个特别有意思的问题!就是咱们的题目,破窗理论,咱们一起来探讨探讨. 百科-破窗理论: 一个房子如果窗户破了,没有人去修补,隔不久,其它的窗户也会莫名其妙地被人打破:一面墙,如果出现一些涂鸦没有被清洗掉,很快的,墙上就布满了乱七八糟.不堪入目的东西:一个很干净的地方,人们不好意思丢垃圾,但是一旦地上有垃圾出现之后,人就会毫不犹豫地抛,丝毫不觉羞愧. 当然,这

java工程积累——加密hibernate数据源连接符

最近很多公司因为安全问题被各种折磨,我们公司出于这方面的考虑,需要对数据库连接进行加密,在网上很容易就找到了解决方案,在这里分享给大家,但是这个解决方案的内容,也引起了我对程序的思考! 解决方案: 环境要求: Spring管理数据库连接 配置步骤 1,  配置spring文件 <span style="font-size:18px;"><!-加密解密类--> <!-加密解密类:因为它继承了配置类,所以它可以更改配置规则--> <beanclas

java工程积累——java 反射 invoke

引: 在java项目中,我们听了很多ORM的概念,我就一直耿耿于怀,怎么就从rs转换成了对象呢?难道要写非常多的判断吗?答案肯定是否定,我们就要探索怎么解决这个问题,刚好在研究我们系统底层架构的时候,挖掘了这一点,现在和大家分享: 深入: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能:在运行时判定任意一个对象

java工程积累——如何处理Tomcat内存溢出

在项目的部署中,我们设置不当,有时会常常遇到一个bug,就是内存溢出,而在百般调试,释放资源之后,却还是没有解决,这时,不要着急,我们静下心来,在数据量,代码量都不多情况下,并且不是很经常出现这bug时,我们要进行一下小小的总结,来处理这类事件的发生! 错误 我们先看,内存溢出的提示,一般会有三种,我们一一看看: 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种情况: 1.OutOfMemoryError: Java heap space 2.OutOfMemoryError

java工程积累——saas之multi-tenancy解析

最近做的项目涉及到比较深入的一部分,就是定义客户关系,在我们的商讨中,我们决定,采用服务商的模式,就是我们是基础服务商,由客户组合服务,向客户提供基于云端的服务支持!这就自然引出了以下概念: saas百科: SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式.它与"on-demand software"(按需软件),the application service provide

java工程积累——权限验证在Ajax中失效的解决方案

最近在公司做的项目一直测试和使用都很好,客户反响也很不错,但是,就在前两天,客户提出了一个bug,但是全队都愁眉不展,在今天做公交车的时候,我突然想到了一种可能,就是我们习以为常的ajax提交出了问题! 起因: 需求:在判断用户session有没有超时的情况,我们使用的是在所有的请求前通过aop进行判断,如果session中,用户登录信息丢失,则重新登录,否则继续! bug情况:在页面提交,跳转下正常判断,但是在用户session过期后,直接使用Ajax提交时,提交失败! 初期方案: 方案1: