Administrator
发布于 2023-06-20 / 38 阅读
0
0

Tree Model

如何从数据库中查询数据,并展示为树形结构?

数据库结构

如下:
image-20230620203015477

主要思路:记录了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);

    }

}

一级菜单如下:

image-20230620202548584

二级菜单如下:

image-20230620202632702


评论