使用递归方法查询所有分类(一)

###递归的方法在很多项目中的很多场景中都会用到,很多教学都拿一些阶乘啊,从1加到100之类的来举例,但对于不懂递归原理的新猿来说,看完这些例子往往不能够做到举一反三,也应用不到项目实践中去。所以我这里举一个项目中会常用到的实例来加深大家的理解~

一、需求分析

大家经常会遇到这样一个场景:根据分类名称查询这个分类及子类下的所有相关文档。这个需求看似很简单,只需要一个findByType(String type)的方法,或者在findAll的时候对type这个参数做判空即可。其实不然,因为一般情况下,文档会放在一个最低级的分类下,也就是这个分类下在没有子类,这样查出来是没有问题的,但是当用户选择一个父类时,你会发现,这个父类下面根本没有关联文档,此时,就需要根据这个父类去查它下面的子类,再继续查结果集中的子类,如果是无限子集,就要查到再无子类时才能终止,然后再用刚查询到的所有分类去查找它们下面的相关文档。此时,就需要用到递归方法了,因为递归方法就是为处理重复操作而生的~

二、代码实现

话不多说,直接上源码:

public class ContentService {//查询文档的mapper@AutowiredContentMapper mapper;//查询分类的mapper@AutowiredContentTypeMapper 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返回即可,拿到了所有的分类,去遍历分类,查询文档即可。

新猿可能对这个逻辑会感到烧脑,但是逐步的去按照这个逻辑去看代码的每一个步骤走到了哪里,就会有恍然大悟的感觉!哈哈~

如果有看不明白的地方,咱评论区见~~

如果觉得有用,请给老弟点个赞!哈哈,下期抽空写一个递归拼接树结构!

使用递归方法查询所有分类(一)相关推荐

  1. 关于查询二级分类的简单方法

    现在项目中大多是前后端分离的项目,我们后端给数据,前端调用数据展示,所以我们后端可以将查到的数据放到集合里面,传递给前端. 1.二级查询的思路与方法,我们可以再创建两个实体,一个是一级实体,一个是二级 ...

  2. 如何查询尼斯分类商品项目

    如何查询尼斯分类商品项目 尼斯分类的全称是<商标注册用商品和服务国际分类尼斯协定>,该协定于1957年6月15日在法国南部城市尼斯签订,1961年4月8日生效.国际分类共包括45类,其中商 ...

  3. 【MySQL】多表查询的分类1:等值连接和非等值连接

    目录 多表查询的分类1:等值连接VS非等值连接 1. 等值连接 2. 非等值连接 多表查询的分类1:等值连接VS非等值连接 1. 等值连接 等值连接指的是,多表查询语句中的连接条件使用的是等号.例如: ...

  4. 子查询及其分类(标量子查询+列子查询+行子查询+表子查询)

    子查询 什么是子查询 子查询概念 子查询:sub query 子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块.当一个查询是另一个查询的条件时,称之为子查询. 子查询:指在一 ...

  5. 数据库子查询 含义-分类-语句

    #进阶7; 子查询 /* 含义: 出现在其他语句中的select语句,称为子查询或内查询 外部的查询语句,称为查询或外查询分类: 按子查询出现的位置:select后面仅仅支持标量子查询(结果集只有一行 ...

  6. 实验课题——最全手机通信录实现版本(【含注释】848行代码)!!!(包括模糊查询、分类查找、模拟拨号、qsort函数实现排序、文件存储、防误触等功能)

    目录 简介: 基本要求: 代码的实现: 1.Contact.h 2.test.c 3.Cantact.c 运行效果图: 部分复杂函数流程图 前两周是本人的实验周,抽到的课题是"手机通信录的实 ...

  7. mysql查询所有分类前三的数据

    设计思路 当mysql查询有很多分类时,可能只需要每种分类的前三或者前十的数据,不需要返回所有的结果,所以我们可以给不同种类的数据添加序号,然后通过序号来筛选结果 例:建一张工人工作质量表,用年份和质 ...

  8. 多表查询的分类及其查询语法

    多表查询分类:     连接查询:         内连接:相当于查询A,B交集部分数据             内连接查询语法:                 隐式内连接              ...

  9. 16.首页查询一级分类商品(分类显示商品)

    1.封装分页PageBean package cn.xdy.shop.util;import java.util.List;public class PageBean<T> {privat ...

最新文章

  1. 【机器学习入门笔记6:OpenCV像素的读取与写入】20190204
  2. kmalloc/kfree,vmalloc/vfree函数用法和区别
  3. oracle-sqlloader的简单使用
  4. 使用SeekBar组件调节屏幕亮度
  5. Modbus协议栈应用实例之一:Modbus RTU主站应用
  6. python处理csv文件将id相同的行合并到同一行并用符号将其隔开_Python探索性数据分析,这样才容易掌握...
  7. Hash类的键值对允不允许为空的问题
  8. 一个人形图案程序c语言,如何用PPT绘制出人形图形
  9. 如何修复GitKraken Inotify Limit Error\idea erro - 升级Ubuntu / Linux inotify限制
  10. Atitit Queue consum algo 队列消费算法fifo lifo ro目录1. 队列消费算法 11.1. FIFO 先入先出 11.2. LIFO 后入先出 不能多开 1
  11. 几个支持SCORM的免费平台
  12. Java毕设项目宠物管理系统计算机(附源码+系统+数据库+LW)
  13. h5打开麦克风权限录音_HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能...
  14. Error:Excepted resource of type id
  15. Unity Burst学习2
  16. Python/Basemap绘制美国人口分布示意图
  17. centos是arm还是amd_amd系列cpu安装linux
  18. Raspberry Pi3驱动Oled ssh1106屏
  19. 大学328门专业课程标准英文翻译模板
  20. 江苏省盐城中学信息竞赛队(YZOI)队规

热门文章

  1. office文件图标显示不正常
  2. 万丈高楼平地起,勿在浮沙筑高台--论程序员基础知识的重要性
  3. Java 版植物大战僵尸思路和源码分享!
  4. 如何打造差异化抖音账号IP?
  5. 学生党无线蓝牙耳机推荐哪个,2022口碑最好的蓝牙耳机推荐
  6. 耳部穴位取穴 耳朵对应身体各部位反射图
  7. 计算机三维制图论文,三维重建初探(整理的一些资料及论文分享)
  8. if函数多个条件php,excelif函数的多个条件使用方法
  9. mysql如何使用多核cpu_利用多核 CPU 实现并行计算
  10. python利用datetime模块计算时间差