Java如何使用递归查询多级树形结构数据(多级菜单)
作者:小徐敲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> {
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
