Mysql多级菜单,使用SSM框架,业务实现

**

方式一

**
首先创建实体,用于接收菜单列表

@Data
public class QueryResDto {
    /**
     * id
     */
    private Integer id;
    /**
     * 菜单名
     */
    private String resName;
    /**
     * 父id
     */
    private Integer upperId;
    /**
     * 子菜单
     */
    private List<QueryResDto> children;
}

controller层这里忽略 , 直接上service

    /**
     * 查询功能菜单
     * @return
     */
    public List<QueryResDto> queryResList() {
    	// 调用方法查询所有菜单项
        List<QueryResDto> queryResDtoList = managementMapper.queryResList();
        
        // 调用方法,处理菜单数据
        return buildTree(queryResDtoList);
    }

    private List<QueryResDto> buildTree(List<QueryResDto> resList) {
        // 创建集合用来封装最终的数据
        List<QueryResDto> resultList = new ArrayList<>();
		// 循环遍历数据
        for (QueryResDto queryResDto : resList) {
        	// 获取 父节点值
            Integer upperId = queryResDto.getUpperId();
            
            // 如果为0代表父节点 放入list,作为父菜单
            if (upperId == null) {
            	// 调用方法 设置子菜单项,传入查询出所有的list对象,和遍历后的对象
                resultList.add(selectTree(queryResDto, resList));
            }
        }
        return resultList;
    }

    private QueryResDto selectTree(QueryResDto queryResDto, List<QueryResDto> resList) {
        //向一层菜单里面放二层菜单,二层里面放三层.... 把对象初始化
        queryResDto.setChildren(new ArrayList<>());
        
        //遍历所有菜单list集合
        for (QueryResDto resDto : resList) {
            // 获取id和父id,进行判断,比较id和父id值是否相同
            if (queryResDto.getId().equals(resDto.getUpperId())) {
            
            	// 如果Children=null,初始化对象
                if (queryResDto.getChildren() == null) {
                    queryResDto.setChildren(new ArrayList<>());
                }
               
                // 如果相等,就把查询出来的子菜单放到父菜单中
                queryResDto.getChildren().add(selectTree(resDto, resList));
            }
        }
        // 返回结果
        return queryResDto;
    }

Mapper

    /**
     * 查询菜单
     * @return
     */
    List<QueryResDto> queryResList();

XML

    <select id="queryResList" resultType="com.XXX.XXX.XXX.XXXX.XXX.dto.QueryResDto">
        select 
               id AS id,
               res_name AS resName,
               upper_id AS upperId 
        from sys_res
    </select>

**

方式二

**

// 实体
@Data
class Menu{
    Integer id;
    Integer parentId;
    String name;
    List<Menu> childList;

    public void addChild(Menu menu) {
        if (childList == null) {
            childList = new ArrayList<>();
        }
        childList.add(menu);
    }
}

// main方法
    public static void main(String[] args) {
        //初始化menu
        List<Menu> menuList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Menu menu = new Menu();
            menu.setId(i);
            menu.setName("name" + i);
            if (i > 0) {
                menu.setParentId(i - 1);
            }
            menuList.add(menu);
        }
        //所有的menu放在menu里面
        HashMap<Integer, Menu> idMenuMap = new HashMap<>();
        //最顶层级的menu
        HashMap<Integer, Menu> finalIdMenuMap = new HashMap<>();
        for (Menu menu : menuList) {
            idMenuMap.put(menu.getId(), menu);
        }
        //建立上下级关系
        for (Menu menu : menuList) {
            Integer parentId = menu.getParentId();
            if (parentId != null) {
                idMenuMap.get(parentId).addChild(menu);
            }else{
                finalIdMenuMap.put(menu.getId(), menu);
            }
        }

        //返回的结果
        System.out.println(JsonUtils.toJson(finalIdMenuMap));
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值