递归获取树形组织机构

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

基础环境 :springboot+mybatis、mysql

测试环境: Navicat、postman。

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

一、数据表设计

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

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

递归获取树形组织机构_第1张图片

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 children;

    public List getChildren() {
        return children;
    }

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

    public int getOrgId() {
        return orgId;
    }

    public void setOrgId(int orgId) {
        this.orgId = orgId;
    }

    public String getOrgName() {
        return orgName;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

    public int getParentId() {
        return parentId;
    }

    public void setParentId(int parentId) {
        this.parentId = parentId;
    }

    public int getSort() {
        return sort;
    }

    public void setSort(int sort) {
        this.sort = sort;
    }
}

 

三、控制层 

package com.zed.zd.controller.dept;

import com.zed.zd.pojo.dept.Dept;
import com.zed.zd.service.dept.IdeptService;
import com.zed.zd.service.exam.IExamInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/dept")
public class DeptController {

    @Autowired
    private IdeptService deptService;


    @GetMapping("/getTreeDept")
    public List getTreeDept(){
        List depts=deptService.getRootDept(0);
        return deptService.getTreeDept(depts);
    }
}

 

在这里需要说明一下,

1、由于直接获取那棵树,所以什么都不需要传。

2、这里需要指定一下根节点的 parent_id ,这里就指定为0。

四、服务层。

一、接口 

package com.zed.zd.service.dept;


import com.zed.zd.pojo.dept.Dept;

import java.util.List;

public interface IdeptService {


    List getTreeDept(List depts);//获取树状结构的部门
    List getRootDept(int parentId );//利用父id进行查询部门
}

二、实现类 

package com.zed.zd.service.dept.impl;

import com.zed.zd.mapper.dept.DeptMapper;
import com.zed.zd.pojo.dept.Dept;
 

import com.zed.zd.service.dept.IdeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;


@Service
public class DeptServiceImpl   implements IdeptService {

    @Autowired
    private DeptMapper deptMapper;
    @Override
    public List getTreeDept(List depts) {

        for (Dept d:depts){
            List depts1 =deptMapper.getchildrenDept(d.getOrgId());
            d.setChildren(depts1);
            getTreeDept(depts1);
        }
        return depts;
    }

    @Override
    public List getRootDept(int id) {
        return deptMapper.getRootDept(id);
    }
}

其实这里的核心代码getTreeDept就是这块,通过递归实现。

1、遍历父节点为0的部门,也就是根节点。

2、通过部门id,获取所有在父节点为0的部门,也就是所有根节点的一级子节点(孩子节点)。

3、把孩子节点放到该部门的孩子节点属性上。

4、通过递归调用以此类推实现整个树的遍历。

五、mapper




    
    

相信聪明的你,一定会看懂,在这里就不在赘述了。

六、好了,万事俱备只欠东风, 下面我们有请我们今天最后一个主角闪亮登场。postman,没错,他此时一定会想,别看你之前说的多玄乎。哼,不过我这关,你一起都是海市蜃楼,呵呵,还拽上成语了。

递归获取树形组织机构_第2张图片

 

[
    {
        "orgId": 3,
        "orgName": "董事长",
        "parentId": 0,
        "sort": 1,
        "children": [
            {
                "orgId": 4,
                "orgName": "经理1",
                "parentId": 3,
                "sort": 1,
                "children": [
                    {
                        "orgId": 7,
                        "orgName": "部门1",
                        "parentId": 4,
                        "sort": 1,
                        "children": []
                    },
                    {
                        "orgId": 8,
                        "orgName": "部门2",
                        "parentId": 4,
                        "sort": 2,
                        "children": []
                    }
                ]
            },
            {
                "orgId": 5,
                "orgName": "经理2",
                "parentId": 3,
                "sort": 2,
                "children": []
            },
            {
                "orgId": 6,
                "orgName": "经理3",
                "parentId": 3,
                "sort": 3,
                "children": [
                    {
                        "orgId": 9,
                        "orgName": "技术部",
                        "parentId": 6,
                        "sort": 12,
                        "children": []
                    }
                ]
            },
            {
                "orgId": 10,
                "orgName": "技术部A经理",
                "parentId": 3,
                "sort": 33,
                "children": []
            }
        ]
    }
]

什么,你还不行,好吧,我们以事实说话。

递归获取树形组织机构_第3张图片

注意核对清楚啊,哇。。。。。。此时有响起来,那热烈的掌声,久久不能平静。。。。。。

 

 

你可能感兴趣的:(工作笔记,Java学习)