在springboot项目中如何根据部门ID查询其上下级所有数据,生成树形结构的数据

 mysql数据库的部门表结构:


需求:将部门的树形结构数据已JSON形式返回给前端


解决思路:
1、先获取当前部门的所有父级节点,
2、再获取当前部门的所有子节点,
3、查询组合(父级节点、当前节点、子节点组合起来)后的节点数据
4、在java中进行遍历生成树形菜单

具体操作如下:

1、部门的实体VO

@Data
public class DepartmentVO {
    private int id;                         //部门ID
    private String parentId;               //部门父级ID
    private String title;                   //部门标题
    private List<DepartmentVO> children;    //子节点
}
2、在service层解析节点数据,生成树形结构实体对象
//根据部门ID获取其父子级数据
public List<DepartmentVO> getOneDataByDeptId(String id) {
    List<DepartmentVO> rslist=new ArrayList<>();

    List<DepartmentVO> depts = mapper.getOneDataByDeptId(id);//查询当前部门数据库中所有父子级记录
    //先将所有一级部门添加至rslist
    for(DepartmentVO model:depts){
        if(model.getParentId()==null){      //如果父级为空,则为顶级部门
            rslist.add(model);
        }
    }

    // 为父级部门设置子部门,getChild是递归调用的
    for (DepartmentVO departmentVO : rslist) {
        //传入父级部门Id,以及所有查询结果
        departmentVO.setChildren(getChild(departmentVO.getId(), depts));
    }

    return rslist;
}

//传进父级ID,查找其子部门
public List<DepartmentVO> getChild(int id,List<DepartmentVO> depts){

    List<DepartmentVO> childList = new ArrayList<>();

    for (DepartmentVO model : depts) {
        // 遍历所有属于父级节点的子节点
        if (StringUtils.isNotBlank(model.getParentId())) {
            if (model.getParentId().equals(id+"")) {
                childList.add(model);
            }
        }
    }

    //然后给所有子节点添加子节点
    for (DepartmentVO childmodel : childList) {
        // 遍历所有属于父级节点的子节点
        childmodel.setChildren(getChild(childmodel.getId(),depts));
    }


    // 递归退出条件
    if (childList.size() == 0) {
        return null;
    }
    return childList;
}

3、在Mapper.xml中如何查询节点的父子级数据

<!--查询节点上下級所有id,返回id集合-->
<sql id="getNoteAllParentAndSonNote">
    <!--查询当前节点的所有父节点-->
    SELECT T2.parent_id  id
    FROM (
        SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM department WHERE id = _id) AS 2v2,
        @l := @l + 1 AS lvl
        FROM
        (SELECT @r := #{queryDeptId}) vars,
        department h
        WHERE @r &lt;&gt; 0
    ) T1
    JOIN department T2
    ON T1._id = T2.id and T2.del_sts ='0'

    UNION
    <!--节点本身-->
    select #{queryDeptId} from department where id=#{queryDeptId}
    UNION

    <!--查询当前节点的所有子节点-->
    SELECT c.id
    FROM
    (
        SELECT a.id,
            IF (
                FIND_IN_SET(a.parent_id ,@pids) > 0,
                IF (
                length(@pids) - length(
                REPLACE (@pids, a.parent_id, '')
                ) > 1,
                IF (
                length(@pids) - length(REPLACE(@pids, a.id, '')) > 1 ,@pids ,@pids := concat(@pids, ',', a.id)
                ) ,@pids := concat(@pids, ',', a.id)
                ),
                0
            ) AS 'plist',
            IF (
                FIND_IN_SET(a.parent_id ,@pids) > 0,
                @pids,
                0
            ) AS ischild
        FROM
        (
            SELECT
            r.id,r.parent_id
            FROM
            department r where r.del_sts ='0'
        ) a,
        (SELECT @pids := #{queryDeptId}) b
    ) c
    WHERE
    c.ischild != 0
</sql>
<!--对应Mapper中的查询方法-->
<select id="getOneDataByDeptId" resultMap="backData1">
    select id,parent_id,dept_name,manager from <include refid="tbName"/>
    <!--条件暂定-->
    <where>
        del_sts ='0'
        and id in (
           <trim suffixOverrides=",">
              <!--这里是引用上面的sql标签-->
              <include refid="getNoteAllParentAndSonNote"/>
           </trim>
        )
    </where>
</select>

以上就是全部内容
  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值