如何从数据库中查询数据,并展示为树形结构?
数据库结构
如下:
主要思路:记录了menu_id 和 parent_id,其中顶级菜单项的parent_id为0
代码组装思路
1.从数据库中查找所有的菜单数据
2.遍历2次:第一次遍历借助hashmap存储父节点与子节点的关系,第二次遍历设置子节点,由于map中已经维护好了对应关系所以只需要从map取即可
package com.wp.treedemo.service;
import com.wp.treedemo.domain.Menu;
import com.wp.treedemo.mapper.MenuMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component
public class MenuService {
@Autowired
private MenuMapper menuMapper;
public List<Menu> selectMenu() {
List<Menu> menuList = menuMapper.selectMenu();
/**
* 第一次遍历借助hashmap存储父节点与子节点的关系,第二次遍历设置子节点,由于map中已经维护好了对应关系所以只需要从map取即可。
*/
// key是parentId value是menu集合
Map<String, List<Menu>> menuMap = new HashMap<>();
menuList.forEach(menuItem -> {
List<Menu> children = menuMap.getOrDefault(menuItem.getParentId(), new ArrayList<>());
children.add(menuItem);
menuMap.put(menuItem.getParentId(), children);
});
menuList.forEach(menu -> menu.setChildren(menuMap.get(menu.getMenuId())));
List<Menu> result = menuList.stream().filter(v -> v.getParentId().equals("0")).collect(Collectors.toList());
return result;
}
}
测试:
package com.wp.treedemo;
import com.wp.treedemo.domain.Menu;
import com.wp.treedemo.service.MenuService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class TreeDemoApplicationTests {
@Autowired
private MenuService menuService;
@Test
void contextLoads() {
List<Menu> menus = menuService.selectMenu();
System.out.println(menus);
}
}
一级菜单如下:
二级菜单如下: