数据库数据是树形的,有很多层,不能每层都去循环一次,所有我在网上找了资料来总结下,代码都有实现过的(只要更换一些实体类名称就可以了,照猫画虎)
本人是一枚初到职场的小白,也在学习过程,本文章就是学习记录,希望能够帮到你们,如果不足,请多指教~~
第一步 :在实体类添加一个List存放子数据
第二步:直接复制一下代码放到controller文件下
一些实体类报错的地方修改你当前的实体类就行了
@GetMapping("/listTree")
public AjaxResult listTree(Student student)
{
List<Student> list = studentService.selectStudentList(student);
return AjaxResult.success(getListTree(list));
}
// 判断树形结构
public List<Student > getListTree(List<Student > students ){
//存储非根节点
Map<Long,List<Student>> tempMap=new HashMap<>();
//存储最终的结果
List<Student> resultList=new ArrayList<>();
//遍历数据库查询数据集合,如果父id==0 代表根节点 添加到最终结果中,否则为非根节点添加到临时节点
for(Student student: students){
if(student.getPid() == 0){
resultList.add(student);
}else{
if(tempMap.containsKey(student.getPid())){
tempMap.get(student.getPid()).add(student);
}else{
List<Student> sList = new ArrayList<>();
sList.add(student);
tempMap.put(student.getPid(),sList);
}
}
}
// 遍历所有根节点,通过根节点和非根节点集合,找到这个根节点的所有子节点
for (Student s: resultList){
getChildNode(tempMap, Arrays.asList(s));
}
return resultList;
}
public static void getChildNode(Map<Long,List<Student>> tempMap,List<Student> fatherNodeList ){
for (Student ify : fatherNodeList) {
if (tempMap.containsKey(ify.getStudentId())) {
ify.getChildren().addAll(tempMap.get(ify.getStudentId()));
getChildNode(tempMap,tempMap.get(ify.getStudentId()));
}
}
}
这个接口就可以返回树形结构了
对了有个点是这块要拿最高的父id进行判断,需要根据自己数据库数据进行调整,我的最高父id是0