我是在写树形菜单时遇到的问题,树形数据在数据库中是一张表的自关联存储,在前台解析的的是树形的数据结构,就需要将查询的一条条数据包装为树形结构。
有两个方法:
1、一次查询一层,一层一层往下查,需要使用递归,这个网上例子很多,但是需要发太多查询,不是我想要的。
2、一次查出所有数据,自己拼装为树形结构
数据表结构:
menu_id , name , url , icon , parent_id , ordered
Java类
public class Menu {
private String menuId;
private String name;
private String url;
private String icon;
private String parentId;
private Integer ordered;
private Boolean state;
private List<Menu> children;
/*
get、set方法
*/
}
实现逻辑
/*
* 首先数据库查询的时候最好按照ordered的大小排序,应该是越小的是父节点,越大的是子节点,按照降序排列
也就是子级在上,才好用下面的方法:
1、用查询数据给temp赋值
Map<String, Menu> temp = new LinkedHashMap<String, Menu>();
读取数据库数据,每次一条记录,相当于一个Menu对象
每次都new 一个Menu,数据库赋值,并存储到temp中以ID为key,对象为Value
此时的最低级别在temp顶部,最高级别在temp底部
用LinkedHashMap是因为这个map是循坏是按存储顺序来迭代。
2、循坏temp
当temp赋值结束之后开始循坏temp,从最顶部也就是最低级别开始迭代
判断该节点是不是顶级,如不是顶级就在temp中拿出父节点,设置父级的children.add,
循环结束,最后,拿到temp的最后一个节点,就是最高节点,里面包含N多children
*/
//将所有数据取出放进集合
List<Menu> list = menuMapper.getAll();
/*
* 循环list拿出,每次一条记录,相当于一个Menu对象
* 每次都new 一个Menu,数据库赋值,并存储到temp中以ID为key,对象为Value
* 用LinkedHashMap是因为这个map是循坏是按存储顺序来迭代。
*/
Map<String, Menu> temp = new LinkedHashMap<String, Menu>();
for (Menu menu : list) {
temp.put(menu.getMenuId(), menu);
}
//顶部节点
Menu top = new Menu();
//循环temp
for (Menu menu : temp.values()) {
//判断此节点是不是顶部(因为我的数据库的顶部节点的id是设为null)
if(menu.getParentId() != null){
//不是顶部节点,找到父级并给父级进行children.add方法
Menu parent = temp.get(menu.getParentId());
parent.getChildren().add(menu);
}else{
//已经循坏到顶部,添加子节点
top.getChildren().add(menu);
}
}
//此时的top就是顶部的节点了