从数据库获取的集合转换成树形结构

最近公司做的项目需要返还给前端树形结构的json数据费尽周折,终于解决好了

1.首先创建实体

import java.io.Serializable;
import java.util.List;

public class TreeNode implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6606877917598031235L;
	
	//单位类型
	private Integer type;
	//部门id
	private Integer  deptId;
	//部门父id
	private Integer  parentId;
	//单位名称
	private String name;
	//单位id
	private Long id;
	//该部门下的子部门
	private List<TreeNode> childNode;
//下面set,get方法省去了

2.从数据库获取数据,也可以自定义数据

/**
	 * 查询单位集合
	 * @return
	 */
	 //mapper层
	@Select("select * from department where IS_DELETED=  "+BaseParam.IS_DELETED_NORMAL)
	List<TreeNode> findDepartmentList();

3.创建树形结构工具类

package com.czhl.training.common.util;

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

import com.czhl.training.common.base.data.TreeNode;

//树形结构工具类
public class TreeUtils {

	 public static Map<String,Object> mapArray = new LinkedHashMap<String, Object>();
	 
	    public static List<TreeNode> menuCommon; //TreeNode是我刚创建的实体类,你需要放你的实体类
	    public static List<Object> list = new ArrayList<>();
	 
	    public static List<Object> treeMenu(List<TreeNode> menu){
	         menuCommon = menu;
	        for (TreeNode treeNode : menu) {
	            Map<String,Object> mapArr = new LinkedHashMap<String, Object>();
	            //我的数据库 `TYPE` int(4) DEFAULT NULL COMMENT '部门类型: 1根部门(企业),2二级单位,3三级部门,依次类推
	            //这个根据需求,有可能父部门id是一样的,那就在判断语句中把父部门的id等于多少作为if中的条件
	            if (treeNode.getType()==1) {
	            	setTreeMap(mapArr,treeNode);
	                list.add(mapArr);
				}
	          
	        }
	        return list;
	    }
	    
	    //这里的fid参数是父id
	    public static List<?> menuChild(Integer fid){
	        List<Object> lists = new ArrayList<Object>();
	        for(TreeNode a:menuCommon){
	            Map<String,Object> childArray = new LinkedHashMap<String, Object>();
	            if (a.getParentId()==fid) {
	            	 setTreeMap(childArray,a);
		               lists.add(childArray);
				}
	           
	        }
	        return lists;
	    }
	    
	    //写上你的类结构
	    private static void setTreeMap(Map<String,Object> mapArr,TreeNode treeNode){
	    	mapArr.put("id", treeNode.getId());
	    	mapArr.put("type", treeNode.getType());
	        mapArr.put("deptId", treeNode.getDeptId());
	        mapArr.put("parentId", treeNode.getParentId());
	        mapArr.put("name", treeNode.getName());
	        mapArr.put("children", menuChild(treeNode.getDeptId()));
	    }
	
}

4.service层做逻辑处理

	//这是service的实现类,service我没写
	//由于本身已经处理了,没有什么逻辑处理可做
	//这里返回值是List也可以,这是我们公司写代码的规范,所以这样写
	@Override
	public RespEntity<?> findDepartmentTree() {
		//这里是调用mapper层的方法获取集合
		List<TreeNode> list = departmentMapper.findDepartmentList();
		//通过树形结构工具类把集合换成树形结构的集合
		List<Object> objects = TreeUtils.treeMenu(list);
		return RespEntity.successResp("查询成功", objects);
	}

5.controller层实现返还json数据

/**
	 * 查询单位类列表,并转换为树形结构
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/findDepartmentTree")
	public Object findDepartmentTree() {
		try {
			return departmentService.findDepartmentTree();
		} catch (BaseException e) {
			logger.error(e.getMessage(),e);
			return RespEntity.errorResp(Constants.BUSI_ERROR, e.getMessage(), e);
		}catch (Exception e) {
			logger.error(e.getMessage(),e);
			return RespEntity.errorResp(Constants.BUSI_ERROR, e.getMessage(), e);
		}
		
	}

获取的结果,太长没有截完整的图

我也是参考别人的,因为我们实现的结果稍微有一些不同,所以有所改变
http://www.pianshen.com/article/1604339844/ (附上原链接)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值