**
方式一
**
首先创建实体,用于接收菜单列表
@Data
public class QueryResDto {
/**
* id
*/
private Integer id;
/**
* 菜单名
*/
private String resName;
/**
* 父id
*/
private Integer upperId;
/**
* 子菜单
*/
private List<QueryResDto> children;
}
controller层这里忽略 , 直接上service
/**
* 查询功能菜单
* @return
*/
public List<QueryResDto> queryResList() {
// 调用方法查询所有菜单项
List<QueryResDto> queryResDtoList = managementMapper.queryResList();
// 调用方法,处理菜单数据
return buildTree(queryResDtoList);
}
private List<QueryResDto> buildTree(List<QueryResDto> resList) {
// 创建集合用来封装最终的数据
List<QueryResDto> resultList = new ArrayList<>();
// 循环遍历数据
for (QueryResDto queryResDto : resList) {
// 获取 父节点值
Integer upperId = queryResDto.getUpperId();
// 如果为0代表父节点 放入list,作为父菜单
if (upperId == null) {
// 调用方法 设置子菜单项,传入查询出所有的list对象,和遍历后的对象
resultList.add(selectTree(queryResDto, resList));
}
}
return resultList;
}
private QueryResDto selectTree(QueryResDto queryResDto, List<QueryResDto> resList) {
//向一层菜单里面放二层菜单,二层里面放三层.... 把对象初始化
queryResDto.setChildren(new ArrayList<>());
//遍历所有菜单list集合
for (QueryResDto resDto : resList) {
// 获取id和父id,进行判断,比较id和父id值是否相同
if (queryResDto.getId().equals(resDto.getUpperId())) {
// 如果Children=null,初始化对象
if (queryResDto.getChildren() == null) {
queryResDto.setChildren(new ArrayList<>());
}
// 如果相等,就把查询出来的子菜单放到父菜单中
queryResDto.getChildren().add(selectTree(resDto, resList));
}
}
// 返回结果
return queryResDto;
}
Mapper
/**
* 查询菜单
* @return
*/
List<QueryResDto> queryResList();
XML
<select id="queryResList" resultType="com.XXX.XXX.XXX.XXXX.XXX.dto.QueryResDto">
select
id AS id,
res_name AS resName,
upper_id AS upperId
from sys_res
</select>
**
方式二
**
// 实体
@Data
class Menu{
Integer id;
Integer parentId;
String name;
List<Menu> childList;
public void addChild(Menu menu) {
if (childList == null) {
childList = new ArrayList<>();
}
childList.add(menu);
}
}
// main方法
public static void main(String[] args) {
//初始化menu
List<Menu> menuList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Menu menu = new Menu();
menu.setId(i);
menu.setName("name" + i);
if (i > 0) {
menu.setParentId(i - 1);
}
menuList.add(menu);
}
//所有的menu放在menu里面
HashMap<Integer, Menu> idMenuMap = new HashMap<>();
//最顶层级的menu
HashMap<Integer, Menu> finalIdMenuMap = new HashMap<>();
for (Menu menu : menuList) {
idMenuMap.put(menu.getId(), menu);
}
//建立上下级关系
for (Menu menu : menuList) {
Integer parentId = menu.getParentId();
if (parentId != null) {
idMenuMap.get(parentId).addChild(menu);
}else{
finalIdMenuMap.put(menu.getId(), menu);
}
}
//返回的结果
System.out.println(JsonUtils.toJson(finalIdMenuMap));
}