递归获取树形组织机构

这篇博客介绍如何利用递归在SpringBoot+Mybatis环境中实现树形组织机构的展示。作者首先介绍数据表设计,然后跳过POM文件直接进入业务实现,包括实体类、控制层、服务层接口及实现、Mapper。最后通过Postman测试展示递归构建的树形结构成功。
摘要由CSDN通过智能技术生成

好久没有更新博客了,前段时间也是一直忙的房子的事情和换工作的事情,也是忙的不亦乐乎。好在现在一切都理顺了,好了,回归到正题,回归到今天的主题。利用递归实现组织机构显示。因为此业务场景非常普遍,如组织机构,多级菜单,反正是涉及到树形结构的业务场景不胜枚举。所以,自己把这核心的代码和思路共享出来,供其他小伙伴和自己共同去学习。

基础环境 :springboot+mybatis、mysql

测试环境: Navicat、postman。

关于如何构建springboot+mybatis网上的资料很多,我在之前的博客也写过,在这里不在赘述。我们直奔主题。

一、数据表设计

在这里我需要说明一下,在看一些开源项目的时候,先不要直接去一头栽到代码里去,那样通常会是雾里探花,研究一番,就把自己搞成了丈二和尚了,所以我一般是会先去看数据表,从业务入手,下一步就去看POM文件 。

 我在数据库里面建立了dept(部门表),为了测试方便,我在这里只建了五个字段 。

org_id (部门id)  org_name  (部门名称) parent_id (父id)sort(排序)  create_date(创建时间)

二、由于此业务简单,所以我们就不看pom文件了,也无非就是spring-boot核心包,mysql、mybatis核心包。我们之间看业务。

建立和数据表对应的实体 。

package com.zed.zd.pojo.dept;

import java.util.List;

/**
 *  @author: shenaiguo
 *  @Date:    
 *  @Description:
 */ 
public class Dept {
    private int orgId;
    private String orgName;
    private int parentId;
    private int sort;
    private List<Dept> children;

    public List<Dept> getChildren() {
        return children;
    }

    public void setChildren(List<Dept> children) {
        this.children = children;
    }

    public int getOrgId() {
        return orgId;
    }

    public void setOrgId(int orgId) {
        this.or
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值