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> {
    
}

总结

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

相关文章

  • Spring AOP注解实战指南

    Spring AOP注解实战指南

    在现代软件开发中,面向切面编程(AOP)是一种强大的编程范式,本文将介绍如何在Spring框架中通过AspectJ注解以及对应的XML配置来实现AOP,在不改变主业务逻辑的情况下增强应用程序的功能,需要的朋友可以参考下
    2024-06-06
  • Java Synchronized锁的使用详解

    Java Synchronized锁的使用详解

    在多线程并发问题中,常用Synchronized锁解决问题。本篇文章主要介绍了并发编程中Synchronized锁的用法知识记录,感兴趣的小伙伴可以了解一下
    2022-10-10
  • 使用Apache POI和SpringBoot实现Excel文件上传和解析功能

    使用Apache POI和SpringBoot实现Excel文件上传和解析功能

    在现代企业应用开发中,数据的导入和导出是一项常见且重要的功能需求,Excel 作为一种广泛使用的电子表格工具,常常被用来存储和展示数据,下面我们来看看如何使用Apache POI和SpringBoot实现Excel文件上传和解析功能吧
    2025-01-01
  • Spring Boot中的Properties的使用详解

    Spring Boot中的Properties的使用详解

    这篇文章主要介绍了Spring Boot中的Properties的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • java微信扫码支付模式一线下支付功能实现

    java微信扫码支付模式一线下支付功能实现

    本篇文章主要介绍了JAVA微信扫码支付模式一线下支付功能实现,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Spring源码解析之Bean的生命周期

    Spring源码解析之Bean的生命周期

    今天给大家带来的是关于Java源码的相关知识,文章围绕着Bean的生命周期展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot结合Docker进行容器化处理指南

    SpringBoot结合Docker进行容器化处理指南

    在当今快速发展的软件工程领域,Spring Boot 和 Docker 已经成为现代 Java 开发者的必备工具,本文将深入讲解如何将一个 Spring Boot 应用进行容器化处理,希望对大家有所帮助
    2025-07-07
  • SpringBoot整合Dubbo zookeeper过程解析

    SpringBoot整合Dubbo zookeeper过程解析

    这篇文章主要介绍了SpringBoot整合Dubbo zookeeper过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java使用Hex编码解码实现Aes加密解密功能示例

    java使用Hex编码解码实现Aes加密解密功能示例

    这篇文章主要介绍了java使用Hex编码解码实现Aes加密解密功能,结合完整实例形式分析了Aes加密解密功能的定义与使用方法,需要的朋友可以参考下
    2017-01-01
  • Java设置Map过期时间的的几种方法举例详解

    Java设置Map过期时间的的几种方法举例详解

    本文详细介绍了Java中使用轻量级缓存组件ExpiringMap以及Guava的LoadingCache缓存机制,ExpiringMap提供了Map自动过期、监听事件等功能,而LoadingCache提供了缓存回收、数据加载等高级功能,两者为Java项目提供了有效的数据管理和缓存解决方案,需要的朋友可以参考下
    2024-10-10

最新评论