一、概述
在开发过程中,构造记录的父子层级关系是一种很重要的应用。例如权限处理中的菜单树、部门之间的上下级关系,在记录的创建过程、数据的渲染都需层级关系的数据。
二、实践实例——层级数据的构造
实现目标:根据用户ID获取当前用户的所属所有子记录。
2/1 数据库设计
在表的创建过程中,需要的基本属性,每条记录需要一个主键作为唯一的标识,需要一个指向父子结点的parentid。例如
2/2 编码实现
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Setter
@Getter
public class TreeMode {
private Integer id;
private String name;
private int parentid;
private List<TreeMode> children;
}
@RequestMapping("/testfunction.do")
public void testfunction(HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//因为数据库中的数据量不是很多,算法效率并不高,但是还是可以实现
//可以重新设计数据库和优化算法过程提升效率
//获取所有的权限列表
List<Function> list = functionService.findFunctionList();
List<TreeMode> treelist=new ArrayList<TreeMode>();
JSONObject json = new JSONObject();
for(int i=0;i<list.size();i++)
{
TreeMode treeMode=new TreeMode();
treeMode.setId(list.get(i).getFunc_id());
treeMode.setName(list.get(i).getFunc_name());
treeMode.setParentid(list.get(i).getParent_id());
treelist.add(treeMode);
}
//假设当前节点为1
treelist =getTree(treelist,1);
if(list != null && list.size() > 0){
json.put("data",treelist);
}
PrintWriter out = response.getWriter();
out.print(json.toString());
out.flush();
out.close();
}
//递归函数
public static List<TreeMode> getTree(List<TreeMode> treelist,Integer id)
{
List<TreeMode> result=new ArrayList<TreeMode>();
List<TreeMode> temp=new ArrayList<TreeMode>();
for(TreeMode entity:treelist)
{
if(entity.getParentid()==id)
{
TreeMode mode=new TreeMode();
mode.setId(entity.getId());
mode.setName(entity.getName());
mode.setParentid(entity.getParentid());
//递归
temp=getTree(treelist,entity.getId());
//有子节点
if(temp.size()>0)
{
mode.setChildren(temp);
}
result.add(mode);
}
}
return result;
}
三、结果
四、最后
(1)因为数据库中的数据量不是很多,算法效率并不高,但是还是可以实现
(2)可以重新设计数据库和优化算法过程提升效率