树结构的数据,最核心的思想就是递归。
1.数据库存储了树结构标识:
若,数据库存储了数据的父层标识ID或子层标识ID,就可以利用resultMap(假设resultMap的id为treeMap) 嵌套collection(假设collection名称为childrenList),collection中也映射到treeMap,这样就递归得到树结构。
2.数据库没有存储父类标识或每一层的标识字段不一样:
如:学校——班级——学生
类似这种,就需要用到自定义注解(层级、展示的字段。。。根据需求需要的内容)、泛型、递归、反射工具类来写公共方法,将查询结果,根据自定义注解在model上字段的注解的信息,进行树结构相关信息的封装。
3.树结构封装、计算卷积、排序思路:
1)获取model上自定义注解的关键字段,关键信息,对应的反射字段,用于后续递归封装时使用。如:key,parentKey,children,isSort(树结构排序字段),calculate(需要向上卷积的字段,树结构数据常常需要卷积处理),这些都是自定义的注解信息。
2)补充数据根节点和树结构:树的结构需要指定根节点,没有的需要默认一个根节点数据,对于没有父节点的数据需要将这些数据补充结构,挂载到根节点。
3)获取根节点,从根节点,使用父子关系,递归填充children,构建树结构。
4)树结构,封装完,遍历要计算卷积的model反射字段,从根节点开始,递归,计算卷积数据。
(注:需要放在构建树结构之后,因为放在之前树结构混乱,计算出的卷积是错误的。)(对于有平铺字段的放在构建树结构之前,使用java1.8分组求和后,构建树结构,使用下来,还是封装完,递归计算卷积好。)
5)根据指定字段,遍历树,从根节点开始,使用Collections.sort()等,对每个节点children进行排序,直到最底层,没有children,结束。
4.对于树结构删除一些数据,也需要递归处理,并且是在树结构封装之后。如:删除总数为0的数据。注意:在for循环递归处理时,删除后,集合总数会变,下标i也会变,需要i--,处理。