效率高一点的快速树工具类

一、需求 :  (从数据库) 查询出 3下面所有的子节点数据 

二、普通实现方式

第1种:     可以使用数据库的递归函数直接实现,比如oracle数据库,

第2种:     查询出所有数据节点,再组装树形取出3节点(和子树形) ; 

第3种:     一直for 循环查询数据库 , 查询出 3 节点的儿子节点,  儿子节点再 循环查孙子节点...直到查不到再下面一级的子节点为止 ; 

 缺点:  

  第1种:  依赖于数据库函数,或者自己写数据库的函数(function)实现 ;

  第2种: 浪费性能和效率慢, 查询少量数据需要全表查一次 (这里不考虑缓存起来的情况,只考虑查数据库);

  第3种:  取决于要查的节点后面的深度(或者说层数), 越深 则查询数据库次数越多,比如有10层,需要至少查10次数据库 ; 另外: 每一种这样的业务列表,可能都需要写一套这样的循环逻辑 ;

 

 三、 高效的实现方式

 1. 首先,有一个前提条件: 

  数据类型节点 下面不能有子节点;  这样保证查找到每一个数据节点: 从 目录型(文件夹型)节点 ->目录型节点->....目录型节点->最后的数据节点 ;

  2. 思路: 

          1. 先查询数据库出所有的 目录型(文件夹型)节点根据type字段类查;比如查询出目录型节点有100个;

          2. 将目录型(文件夹型)节点组装成树形,找出需要查询的目录节点,比如 上面图中的3"债券信用分析", 可以获取到一个它下面的所有子目录节点列表 ,比如有10个;

          3.查询数据库, 找出父ID(pid) in ( 上面 10个目录节点ID ) 的 数据类型节点的数据节点列表 ;

          4. 用步骤3的数据节点列表 填充上面 10个目录节点的children列表,得到 3"债券信用分析" 的树节点 ;

 3. 图示:

 

 四、测试

   1. 测试--整个树节点

 

 2. 文科--下面节点树

 

五、项目代码使用示例

  业务service这里只用准备两个function,然后调用工具类就可以 ;

 

 六、代码实现

    1. 实体类上使用三个注解,表示id,pid,和children列表 ;

 

2 . tree方法

 

3. 查询当前节点和所有子节点的方法

 

 4. 反射方法 (getterIdMethod举例)

 七、总结

 

 上面的复杂度可能不是十分准确, 这里假设全表数据量查询是比较慢的情况,  也就是说 T 全表查数据时间 >>  T带条件查数据时间。

posted @ 2023-06-15 18:12  将军上座  阅读(37)  评论(0编辑  收藏  举报