Java如何使用递归查询多级树形结构数据(多级菜单)

 更新时间:2024年07月17日 09:40:16   作者:小徐敲java  
这篇文章主要介绍了Java如何使用递归查询多级树形结构数据(多级菜单),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1:数据库表

字段resource_id为自增主键,其中最顶级的菜单的父类ID是用-1表示的

下面我们就来查询这张表

2:实体类

childMenu是用于装子类数据的;

@TableField(exist = false)表示该属性不为数据库表字段,但是必须使用

package org.jeecg.modules.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;

@Data
@TableName("sys_depart_Manage")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="部门对象", description="部门对象")
public class SysDepartManage {
	
	/**部门名称*/
    @ApiModelProperty(value = "部门名称")
	private String departName;

	/**资源id*/
	@ApiModelProperty(value = "资源id")
	@TableId(type = IdType.AUTO)
	private Integer resourceId;

	/**父id*/
	@ApiModelProperty(value = "父id")
	private String parentId;

	/**是否展示*/
	@ApiModelProperty(value = "是否展示")
	private Integer showInput;


	/**创建时间*/
	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间")
	private Date createTime;

	/**更新时间*/
	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新时间")
	private Date updateTime;

	/** 子类菜单数据 */
	@TableField(exist = false)
	private List<SysDepartManage> childMenu;

}

3:controller层代码

	@Resource
    private ISysDepartManageService sysDepartManageService;
	/**
     * 部门树形查询
     * @param parentID
     * @return
     */
    @GetMapping("/menu")
    @ApiOperation(value="部门树形查询", notes="部门树形查询")
    public List<SysDepartManage> findMenu(@RequestParam String parentID) {
        return sysDepartManageService.findMenu(parentID);
    }

4:service层代码

package org.jeecg.modules.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.system.entity.SysDepartManage;
import java.util.List;
import java.util.Map;

public interface ISysDepartManageService extends IService<SysDepartManage> {

    List<SysDepartManage> findMenu(String parentID );

}

5:方法

serviceimpl层代码(多次查询数据库,耗性能)

package org.jeecg.modules.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.system.entity.SysDepartManage;
import org.jeecg.modules.system.mapper.SysDepartManageMapper;
import org.jeecg.modules.system.service.ISysDepartManageService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @Description: 部门角色
 * @Author: jeecg-boot
 * @Date:   2020-02-12
 * @Version: V1.0
 */
@Service
public class SysDepartManageServiceImpl extends ServiceImpl<SysDepartManageMapper, SysDepartManage> implements ISysDepartManageService {

    @Override
    public List<SysDepartManage> findMenu(String parentID) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        //查询条件
        queryWrapper.eq("parent_id", parentID);
        List<SysDepartManage> list = baseMapper.selectList(queryWrapper);
        for (SysDepartManage departManage : list) {
            //递归子类数据
            departManage.setChildMenu(findMenu(departManage.getResourceId().toString()));
        }
        return list;
    }
}

6:方法2:serviceimpl层代码(只查询数据库1次)

package org.jeecg.modules.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.system.entity.SysDepartManage;
import org.jeecg.modules.system.mapper.SysDepartManageMapper;
import org.jeecg.modules.system.service.ISysDepartManageService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Service
public class SysDepartManageServiceImpl extends ServiceImpl<SysDepartManageMapper, SysDepartManage> implements ISysDepartManageService {


    @Override
    public List<SysDepartManage> findMenu(String parentID) {
        //数据查询
        List<SysDepartManage> list = baseMapper.selectList(new QueryWrapper());
        //新建一个用于接收数据的list
        List<SysDepartManage> resultList = new ArrayList<>();
        for (SysDepartManage result : list) {
            if (result.getParentId() == 0) {
                //调用方法给子类添加数据
                resultList.add(getMenuTree(result, list));
            }
        }
        return resultList;
    }

    private SysDepartManage getMenuTree(SysDepartManage result, List<SysDepartManage> list) {
        for (SysDepartManage sysDepartManage : list) {
            //如果父类主键等于传过来实体类的ID
            if (sysDepartManage.getParentId().equals(result.getResourceId())) {
                if (result.getChildMenu() == null) {
                    result.setChildMenu(new ArrayList<>());
                }
                // 递归调用
                result.getChildMenu().add(getMenuTree(sysDepartManage, list));
            }
        }
        return result;
    }

}

7:mapper层代码

package org.jeecg.modules.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.system.entity.SysDepartManage;
import java.util.List;
import java.util.Map;


public interface SysDepartManageMapper extends BaseMapper<SysDepartManage> {
    
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用ffmpeg和mencoder实现视频转码

    Java使用ffmpeg和mencoder实现视频转码

    这篇文章主要为大家详细介绍了Java使用ffmpeg和mencoder实现视频转码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • SpringBoot和MybatisPlus实现通用Controller示例

    SpringBoot和MybatisPlus实现通用Controller示例

    本文主要介绍了SpringBoot和MybatisPlus实现通用Controller示例,只需创建实体类和mapper接口,就可以实现单表的增删改查操作,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • xxl-job的部署及springboot集成使用示例详解

    xxl-job的部署及springboot集成使用示例详解

    XXL-Job是一个分布式任务调度平台,可进行任务调度、管理和监控,并提供任务分片、失败重试、动态分配等功能,这篇文章主要介绍了xxl-job的部署及springboot集成使用,需要的朋友可以参考下
    2023-06-06
  • SpringBoot项目中日志管理与调优指南

    SpringBoot项目中日志管理与调优指南

    在 Spring Boot 开发过程中,日志管理是开发者必须掌握的重要技能之一,合理的日志配置不仅能帮助开发者追踪应用程序的执行流程、定位问题,还能提升应用程序的可维护性,本文将详细探讨 Spring Boot 项目中日志管理的常见问题、解决方案以及最佳实践
    2024-10-10
  • SpringBoot浅析缓存机制之Ehcache 2.x应用

    SpringBoot浅析缓存机制之Ehcache 2.x应用

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。它是Hibernate中的默认缓存框架。Ehcache已经发布了3.1版本。但是本文的讲解基于2.x版本
    2022-08-08
  • Mac电脑安装多个JDK版本的详细图文教程

    Mac电脑安装多个JDK版本的详细图文教程

    目前使用的主流版本还是JDK 8,但偶尔会想体验下新版本(或者旧版本),如果能装多个版本的JDK,而且很方便的切换就好了,这篇文章主要给大家介绍了关于Mac电脑安装多个JDK版本的相关资料,需要的朋友可以参考下
    2024-03-03
  • Java 线程池详解及创建简单实例

    Java 线程池详解及创建简单实例

    这篇文章主要介绍了Java 线程池详解及创建简单实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • PostMan传@RequestParam修饰的数组方式

    PostMan传@RequestParam修饰的数组方式

    这篇文章主要介绍了PostMan传@RequestParam修饰的数组方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot使用@value注入配置失败的解决

    springboot使用@value注入配置失败的解决

    这篇文章主要介绍了springboot使用@value注入配置失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • MyBatis项目的创建和增删查改操作详解

    MyBatis项目的创建和增删查改操作详解

    这篇文章主要介绍了MyBatis项目的创建和增删查改操作,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-11-11

最新评论