递归的方式查询出多级目录

1:数据库关系(MYSQL)
id (自增的id)pid(父级目录的id)roleName(目录名称)
10一级目录
21二级目录
32三级目录
43四级目录
2:程序持久层代码

2-1:程序持久层接口

    /**
     * 通过PID查询单条数据
     * @param pid 父级主键
     * @return 实例对象
     */
    List<Role> queryByPid(Integer pid);

2-2:程序持久层接口映射XML

   <select id="queryByPid" resultMap="Role">
        select
          id, pid, roleName
        from digui.table_test
        where pid = #{pid}
    </select>

这里的持久层是通过 父级的pid查询出对应的所有目录信息,以一个集合的形式返回

2:递归获取所有的目录(重点来了)
    @Override
    public List<Role> findAllRole() {
        List<Role> data = out(0);
        return data;
    }

    private List<Role> out(int i) {
        //查询当前pid对应的所有目录(该目录是用pid查询的,所以是对应的子目录)
        List<Role> list= this.roleDao.queryByPid(i);
        //如果集合的长度大于1,遍历集合,不然直接返回数据
        if(list.size() > 0) {
            for (Role role: list) {
                //再通过其id作为pid查询他的下级目录
                table.setList( out( role.getId() ) );
            }
        }
        return list;
    }

解释:
1:首先我在 findAllRole 方法中先第一此调用 out 方法,因为我们传入的参数是 pid(父级id),一级目录的pid我们默认是 0(随意),所以我们调用 out 方法时传入的参数时 0
2:在 out 方法中我们首先先调用持久层接口,通过传入的参数 pid 获取所有的目录,这个时候我们需要判断集合的 长度 ,如果长度为0,说明这个pid对应的子目录是没有的(这个点注意,这个集合可能是一级目录集合,也可能是二三四级目录)。反之我们遍历,然后将遍历的每一个元素作为父级目录查询出子集然后set到实体中,看代码,看不懂就细品

最后贴出我最后查出来的结果:

[
    {
        "id": 1,
        "pid": 0,
        "rolename": "一级目录",
        "list": [
            {
                "id": 2,
                "pid": 1,
                "rolename": "二级目录",
                "list": [
                    {
                        "id": 3,
                        "pid": 2,
                        "rolename": "三级目录",
                        "list": [
                            {
                                "id": 4,
                                "pid": 3,
                                "rolename": "四级目录",
                                "list": []
                            }
                        ]
                    }
                ]
            }
        ]
    }
]
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值