使用递归方法查询所有分类(一)
使用递归方法查询所有分类(一)
###递归的方法在很多项目中的很多场景中都会用到,很多教学都拿一些阶乘啊,从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.二级查询的思路与方法,我们可以再创建两个实体,一个是一级实体,一个是二级 ...
- 如何查询尼斯分类商品项目
如何查询尼斯分类商品项目 尼斯分类的全称是<商标注册用商品和服务国际分类尼斯协定>,该协定于1957年6月15日在法国南部城市尼斯签订,1961年4月8日生效.国际分类共包括45类,其中商 ...
- 【MySQL】多表查询的分类1:等值连接和非等值连接
目录 多表查询的分类1:等值连接VS非等值连接 1. 等值连接 2. 非等值连接 多表查询的分类1:等值连接VS非等值连接 1. 等值连接 等值连接指的是,多表查询语句中的连接条件使用的是等号.例如: ...
- 子查询及其分类(标量子查询+列子查询+行子查询+表子查询)
子查询 什么是子查询 子查询概念 子查询:sub query 子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块.当一个查询是另一个查询的条件时,称之为子查询. 子查询:指在一 ...
- 数据库子查询 含义-分类-语句
#进阶7; 子查询 /* 含义: 出现在其他语句中的select语句,称为子查询或内查询 外部的查询语句,称为查询或外查询分类: 按子查询出现的位置:select后面仅仅支持标量子查询(结果集只有一行 ...
- 实验课题——最全手机通信录实现版本(【含注释】848行代码)!!!(包括模糊查询、分类查找、模拟拨号、qsort函数实现排序、文件存储、防误触等功能)
目录 简介: 基本要求: 代码的实现: 1.Contact.h 2.test.c 3.Cantact.c 运行效果图: 部分复杂函数流程图 前两周是本人的实验周,抽到的课题是"手机通信录的实 ...
- mysql查询所有分类前三的数据
设计思路 当mysql查询有很多分类时,可能只需要每种分类的前三或者前十的数据,不需要返回所有的结果,所以我们可以给不同种类的数据添加序号,然后通过序号来筛选结果 例:建一张工人工作质量表,用年份和质 ...
- 多表查询的分类及其查询语法
多表查询分类: 连接查询: 内连接:相当于查询A,B交集部分数据 内连接查询语法: 隐式内连接 ...
- 16.首页查询一级分类商品(分类显示商品)
1.封装分页PageBean package cn.xdy.shop.util;import java.util.List;public class PageBean<T> {privat ...
最新文章
- 【机器学习入门笔记6:OpenCV像素的读取与写入】20190204
- kmalloc/kfree,vmalloc/vfree函数用法和区别
- oracle-sqlloader的简单使用
- 使用SeekBar组件调节屏幕亮度
- Modbus协议栈应用实例之一:Modbus RTU主站应用
- python处理csv文件将id相同的行合并到同一行并用符号将其隔开_Python探索性数据分析,这样才容易掌握...
- Hash类的键值对允不允许为空的问题
- 一个人形图案程序c语言,如何用PPT绘制出人形图形
- 如何修复GitKraken Inotify Limit Error\idea erro - 升级Ubuntu / Linux inotify限制
- Atitit Queue consum algo 队列消费算法fifo lifo ro目录1. 队列消费算法 11.1. FIFO 先入先出 11.2. LIFO 后入先出 不能多开 1
- 几个支持SCORM的免费平台
- Java毕设项目宠物管理系统计算机(附源码+系统+数据库+LW)
- h5打开麦克风权限录音_HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能...
- Error:Excepted resource of type id
- Unity Burst学习2
- Python/Basemap绘制美国人口分布示意图
- centos是arm还是amd_amd系列cpu安装linux
- Raspberry Pi3驱动Oled ssh1106屏
- 大学328门专业课程标准英文翻译模板
- 江苏省盐城中学信息竞赛队(YZOI)队规