1:数据库关系(MYSQL)
id (自增的id) | pid(父级目录的id) | roleName(目录名称) |
---|---|---|
1 | 0 | 一级目录 |
2 | 1 | 二级目录 |
3 | 2 | 三级目录 |
4 | 3 | 四级目录 |
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": []
}
]
}
]
}
]
}
]