效率高一点的快速树工具类
一、需求 : (从数据库) 查询出 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带条件查数据时间。