使用递归方法查询所有分类(一)
###递归的方法在很多项目中的很多场景中都会用到,很多教学都拿一些阶乘啊,从1加到100之类的来举例,但对于不懂递归原理的新猿来说,看完这些例子往往不能够做到举一反三,也应用不到项目实践中去。所以我这里举一个项目中会常用到的实例来加深大家的理解~
一、需求分析
大家经常会遇到这样一个场景:根据分类名称查询这个分类及子类下的所有相关文档。这个需求看似很简单,只需要一个findByType(String type)的方法,或者在findAll的时候对type这个参数做判空即可。其实不然,因为一般情况下,文档会放在一个最低级的分类下,也就是这个分类下在没有子类,这样查出来是没有问题的,但是当用户选择一个父类时,你会发现,这个父类下面根本没有关联文档,此时,就需要根据这个父类去查它下面的子类,再继续查结果集中的子类,如果是无限子集,就要查到再无子类时才能终止,然后再用刚查询到的所有分类去查找它们下面的相关文档。此时,就需要用到递归方法了,因为递归方法就是为处理重复操作而生的~
二、代码实现
话不多说,直接上源码:
public class ContentService {
//查询文档的mapper
@Autowired
ContentMapper mapper;
//查询分类的mapper
@Autowired
ContentTypeMapper typemapper;
public List<KnowledgeContent> findAll(Integer start,Integer end,String mytype,Date starttime,Date endtime){
List<KnowledgeContent> lists = new ArrayList<KnowledgeContent>();
//递归查询所有分类
List<KnowledgeContentType> childType = getChildType(mytype);
System.out.println("递归的结果是:"+childType.toString());
for (int i = 0; i < childType.size(); i++) {
List<KnowledgeContent> list = mapper.findAll(start, end, childType.get(i).getId(), starttime, endtime);
for (int j = 0; j < list.size(); j++) {
lists.add(list.get(j));
}
}
return lists;
}
/*
* 递归方法
*/
private List<KnowledgeContentType> getChildType(String superid) {
System.out.println("我来递归查询了");
List<KnowledgeContentType> childtype = typemapper.findBySuperid(superid);
if (childtype.size() != 0) {
for (int i = 0; i < childtype.size(); i++) {
if (typemapper.findBySuperid(childtype.get(i).getId()).size() != 0) {
List<KnowledgeContentType> li = getChildType(childtype.get(i).getId());
for (int j = 0; j < li.size(); j++) {
childtype.add(li.get(j));
}
}
}
}
return childtype;
}
findAll()方法中的start,end是做分页用的,starttime,endtime是做时间区间查询用的,这四个参数讲的递归查询方法没有任何关系,大家可以不用关注它们。
当用户传一个mytype(分类id)进来时,我们直接调用下面写得递归方法,即getChildType(),调这个方法后,递归第一步,先使用findBySuperid()查询这个id下有没有子类,然后对查询到的结果做判断,如果不为空,则将查询到的子类的id作为superid继续查,继续查的时候,直接调用递归方法自身,也就是自己调自己,直到查出来结果为null后停止查询,此时所有查询到的结果都被这个childType给add进去了,所以把childType返回即可,拿到了所有的分类,去遍历分类,查询文档即可。
新猿可能对这个逻辑会感到烧脑,但是逐步的去按照这个逻辑去看代码的每一个步骤走到了哪里,就会有恍然大悟的感觉!哈哈~
如果有看不明白的地方,咱评论区见~~
如果觉得有用,请给老弟点个赞!哈哈,下期抽空写一个递归拼接树结构!