以这张菜单信息表为例,parent_id指向父id,在这个表中是指向menu_id
返回这样的数据
这个菜单表的实体: (展示重要的字段)
/** 菜单ID */
private Long menuId;
/** 菜单名称 */
private String menuName;
/** 父菜单名称 */
private String parentName;
/** 父菜单ID */
private Long parentId;
.........
/** 子菜单 */
private List<SysMenu> children = new ArrayList<SysMenu>();
直接上service.impl层的代码:
/**
这个方法是controller调用的方法,根据用户ID查询菜单
*
*
* @param userId 用户名称
* @return 菜单列表
*/
@Override
public List<SysMenu> selectMenuTreeByUserId(Long userId)
{
List<SysMenu> menus = null; // 返回的结果集
if (SecurityUtils.isAdmin(userId)) // 判断是不是超级管理员
{
menus = menuMapper.selectMenuTreeAll();// 是超级管理员返回所有菜单列表
}
else // 不是,则按照userId去查询这个用户能查看的所有菜单列表
{
menus = menuMapper.selectMenuTreeByUserId(userId);
}
// 这里拿到的列表是没有树形结构的
return getChildPerms(menus, 0);
}
/**
* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return 这个父id下所有的子菜单
*/
public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
{
List<SysMenu> returnList = new ArrayList<SysMenu>();
// 注释的是迭代器写法,没注释的是增强for循环写法
/*for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
{
SysMenu t = (SysMenu) iterator.next();
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId() == parentId)
{
recursionFn(list, t);
returnList.add(t);
}
}*/
for (SysMenu t : list){
// 遍历list找到和传入的parentId相等的数据
if (t.getParentId() == parentId)
{
recursionFn(list, t);
returnList.add(t);
}
}
return returnList;
}
/**
*
* 查这个父节点下面还有没有子节点
* @param list
* @param t
*/
private void recursionFn(List<SysMenu> list, SysMenu t)
{
// 得到子节点列表
List<SysMenu> childList = getChildList(list, t);
// 添加子节点列表
t.setChildren(childList);
// 对子节点列表进行遍历
for (SysMenu tChild : childList)
{
// 判断子节点是否有孩子
if (hasChild(list, tChild))
{
// 有的话,继续递归调用,给这个节点添加子孩子
recursionFn(list, tChild);
}
}
}
/**
* 遍历list 得到传入目录下的所有子目录的列表
*/
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
{
List<SysMenu> tlist = new ArrayList<SysMenu>();
/*Iterator<SysMenu> it = list.iterator();
while (it.hasNext())
{
SysMenu n = (SysMenu) it.next();
if (n.getParentId().longValue() == t.getMenuId().longValue())
{
tlist.add(n);
}
}*/
for (SysMenu n : list){
if (n.getParentId().longValue() == t.getMenuId().longValue())
{
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<SysMenu> list, SysMenu t)
{
return getChildList(list, t).size() > 0;
}
迭代器遍历元素与增强for循环变量元素的区别:使用迭代器遍历集合的元素时可以删除集合的元素,而增强for循环变量集合的元素时,不能调用迭代器的remove方法删 除 元素。