使用递归方法拼接分类树结构
上一个递归方法讲的是使用递归方法查询所有分类下的文档,这种方式查出来的结果是一个列表,不便于区分层级关系。今天来讲一个树结构的拼接方法,也就是通过父id查询子类,将子类的结果集拼接到父类下面,再查子类的子类,无限的查下去,查到null为止,拼接起来的结果,像一颗树的结构一样有粗有细有分支,哈哈~
一、逻辑分析
以创建分类的树结构为例,所有的类型,都有自己的id和superid(父id),我们只要根据superid查询它下面有没有子类id,如果有,再将子类的id作为新的superid继续查,一直查到null为止,然后将所有查到的结果拼接成一层套一层的结构即可,结果例如下图的这个样纸~:
这里可能有人会问,如果是第一级分类,那它的superid是啥呢?问的好,我们在录入分类的时候,如果是第一级分类,我们随便给所有的一级分类给一个统一的superid即可,比如我给的就是“0”,也就是我们递归的时候,从superid=“0”开始往下查就行了~。
二、代码实现
树结构的代码,只要想通了逻辑,其实非常简单,话不多说,源码走起~
1、controller层
这里我多加了一个totalCount,是为了统计一下一共有多少个分类,OutgoingUtils是我自己封装的一个返回方式而已,这两个都可以忽略,忽略完之后,其实controller就是一行代码:service.getTypeTree();
//类型树结构
@RequestMapping(value = "/getTypeTree",method = RequestMethod.GET)
public Map<String,Object> getTypeTree(){
List<Map<String,Object>> list = service.getTypeTree();
Integer totalCount = service.totalCount();
return OutgoingUtils.OutgoingParameterPage("200", list, totalCount);
}
2、service层
我们在service层来写递归逻辑
public List<Map<String,Object>> getTypeTree(){
return childType("0");
}
//递归方法
private List<Map<String,Object>> childType(String superid){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
List<KnowledgeContentType> childList = mapper.findBySuperid(superid);
if (childList.size() != 0) {
for (int i = 0; i < childList.size(); i++) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("id", childList.get(i).getId());
map.put("name", childList.get(i).getName());
// map.put("superid", childList.get(i).getSuperid());
// map.put("mystate", childList.get(i).getMystate());
// map.put("createdate", childList.get(i).getCreatedate());
// map.put("discription", childList.get(i).getDiscription());
map.put("children", childType(childList.get(i).getId()));
list.add(map);
}
}
return list;
}
getTypeTree()方法中,就传了个一级分类的superid=“0”,然后进入到递归方法中自己调自己玩一阵子,就把树结构返回给controller了,是不是很easy~
3、mapper层
@Select("select * from cx_knowledge_content_type where superid=#{superid,jdbcType=VARCHAR}")
public List<KnowledgeContentType> findBySuperid(@Param("superid") String superid);
整个递归方法,就用到了一个findBySuperid方法,是不是比想象中的容易多了~
4、调用结果
{"code":"200","body":[{"children":[{"children":[{"children":[{"children":[],"name":"榨汁机","id":"5"},{"children":[],"name":"电火锅","id":"4"}],"name":"厨房电器","id":"3"}],"name":"家用电器","id":"2"}],"name":"电器","id":"1"}],"message":"success","totalCount":5}
可用将结果复制到https://www.json.cn/中展示结果。
三、拓展
我在做这个递归的时候,用的是List<Map<String,Object>>,在遍历子集的时候,用一个map去放想放的结果,这个是很常用的,建议大家多用用。
如果不使用List<Map<String,Object>>也可以做到树结构,那就是在实体类里面增加一个参数,比如我们的实体类叫ContentType,那么再加一个类型为List< ContentType>的,名称比方说叫childType的参数,给它get、set方法,然后在递归的过程中,将子集放到这个childType中就好了~两种方法没有好坏,就看自己喜欢那个就用哪个就好了!
如果有不懂的地方,欢迎评论区留言!