从数据库获取的集合转换成树形结构
最近公司做的项目需要返还给前端树形结构的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..com/article/1604339844/ (附上原链接)