,,,,开发项目的时候遇到需要在表单中选择参会人员,根据不同部门下选择不同的人,在element-ui中有树形控件能满足这种情况,后台封装数据记录一下。
,,封装格式:
,,返回数据格式:
,,接收数据的pojo类:
,,本以为以上的数据结构能满足项目的使用,但是我错了,当时的数据库中只有不到10条的数据并且组织结构非常单一,随后同事导入了数据(6000多条),组织结构也不是如此单一的了,我在项目中固定了三层结构肯定是错的,要一个活的组织树。
,,网上有很多大牛写的方法,递归的,迭代的,我在看了很多大牛写的方法以后,有了实现思想。
,,1 .把所有数据查询出来放到一个映射集合当中,键值为本身数据的id,价值值为数据本身。优点是:只对数据库进行一次查询,避免浪费资源
,,2 .把查询出来的数据判断其有没有父id,把没有父id的存放一个列表集合当中。(顶层数据)
,,3 .把数据进行了循环,根据本身数据的父id获取映射集合当中的数据。例:map.get (entityList.getParentId()),在此之前已经把查询出来的数据一一放到了映射集合当中,其实这一步就是相当于判断本身在所有的数据中有没有父亲。
,,4 .如果有父亲的话进行判断父亲有没有孩子,有就直接加,没有就先给父亲分配一个空间(房子),有了房子你才能住进去。
,,顺着这个思想,以下是代码实现。
,,数据的接口类:
,,可根据自己本身情况更改接口所要实现的发,放我这接口类只是实现了某些属性的,集方法,写这个接口类主要是为了下面的工具类,定义泛型T的类型(我是这么理解的,理解的不是很好,网上有很多资料,可自行查看)
/* * *树形数据实体接口 * @author YangWenHui * @date 2018年4月11日 * @param & lt; T> */公共接口dataTree{ ,,,公共字符串getId (); 公共字符串getParentId (); 公共空间setChildList (List childList); 公共List getChildList (); }
工具类:
,,以下的泛型T就是你接收数据的实体类,要继承上面数据接口类
/* * *获取树型工具类 * @author YangWenHui * */公开课TreeUtil {//获取顶层节点 公共静态& lt; T扩展dataTreegetTreeList(字符串topId List entityList) { List ,resultList=new ArrayList<的在();//存储顶层的数据 T> Map<对象;,treeMap=new HashMap<的在(); T itemTree; for (int i=0; i< entityList.size (),, ! entityList.isEmpty();我+ +){ itemTree=entityList.get(我); treeMap.put (itemTree.getId (), itemTree);//把所有的数据放当到地图中,id为键 如果(topId.equals (itemTree.getParentId ()) | | itemTree.getParentId ()==null){//把顶层数据放到集合中 resultList.add (itemTree); } }//循环数据,把数据放到上一级的小朋友都属性中 for (int i=0;i ()); } data.getChildList阀门()(itemTree);//把子节点放到父节点childList当中 treeMap.put (itemTree.getParentId()、数据);//把放好的数据放回当地图中 } } 返回resultList; } }
实体类:
,,接收数据的实体类,其实不用写,设置方法了,因为@ data这个注解已经帮我们写好了,设置方法了,这个注解可以帮我们节省时间。
/* * *生成树数据的接收类 * @author YangWenHui * */@ data 公共类OtlDeptMenu实现dataTreeelement-ui树形控件后台返回的数据+生成组织树的工具类