查询语句
<!--查询菜单-->
<select id="selectMenuByParentId" parameterType="com.user_service.pojo.SystemMenu" resultType="com.user_service.pojo.SystemMenu">
SELECT * from system_menu A
<where>
<if test="parentId!= '' and parentId != null">
FIND_IN_SET(id, GET_MENU_CHILD_NODE(#{
parentId}))
</if>
</where>
</select>
实体类
import java.io.Serializable;
import java.util.List;
/**
* @Author:刘德安
* @Date: 2021/2/5 11:46
* 菜单表
*/
public class SystemMenu implements Serializable {
//编号
private Integer id;
//菜单名
private String name;
//父菜单编号
private Integer parentId;
//菜单级别
private String level;
//地址
private String url;
//状态(0启用,1禁止)
private String state;
//显示顺序
private String order;
//备注
private String remarks;
//存放子菜单
private List<SystemMenu> children;
//... 省去getter和setter方法以及toString方法
}
递归查询
/**
* 根据父节点查询菜单信息
* */
@Override
public Map<String,Object> selectMenuByParentId(JSONObject json){
Map<String,Object> resultData = new HashMap();
try {
String parentId = json.getString("parentId");
SystemMenu bean = new SystemMenu();
if(!StringUtils.isNull(parentId)) {
bean.setParentId(Integer.valueOf(parentId));
}
// 获取所有菜单数据
List<SystemMenu> list = userMapper.selectMenuByParentId(bean);
//定义 存储一级菜单
List<SystemMenu> menuList = new ArrayList<SystemMenu>();
// 先找到所有的一级菜单
for (int i = 0; i < list.size(); i++) {
// 一级菜单没有父菜单,为null
if (list.get(i).getParentId()==null) {
menuList.add(list.get(i));
}
}
/* 根据Menu类的order排序 */
Collections.sort(menuList, order());
// for调用递归,循环获取所有子菜单
for (SystemMenu menu : menuList) {
menu.setChildren(getChildmenus(menu.getId(), list));
}
resultData.put( "success" , "true" );
resultData.put( "list" , menuList);
return resultData;
} catch (Exception e) {
e.printStackTrace();
resultData.put( "success" , "true" );
resultData.put( "list" , new ArrayList());
return resultData;
}
}
/**
* 递归子菜单
* @param id 父节点id
* @param menus 所有菜单列表
* @return 每个根节点下,所有子菜单列表
*/
private List<SystemMenu> getChildmenus(Integer id, List<SystemMenu> menus) {
// 子菜单
List<SystemMenu> childMenus = new ArrayList<>();
for (SystemMenu menu : menus) {
if (menu.getParentId()!=null) {
// 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
//相等说明:为该根节点的子节点。
if (menu.getParentId().equals(id)) {
childMenus.add(menu);
}
}
}
//递归
for (SystemMenu menu : childMenus) {
menu.setChildren(getChildmenus(menu.getId(),menus));
}
Collections.sort(childMenus,order()); //排序
//如果节点下没有子节点,返回一个空List(递归退出)
if (childMenus.size() == 0) {
return null;
}
return childMenus;
}
/*
* 排序,根据order排序
*/
public Comparator<SystemMenu> order(){
Comparator<SystemMenu> comparator = new Comparator<SystemMenu>() {
@Override
public int compare(SystemMenu o1, SystemMenu o2) {
if (o1.getOrder() != o2.getOrder()){
return Integer.valueOf(o1.getOrder()) - Integer.valueOf(o2.getOrder());
}
return 0 ;
}
};
return comparator;
}
最后返回的Json如下
{
"success": "true",
"list": [
{
"id": 2021001,
"name": "首页",
"parentId": null,
"level": "1",
"url": "1",
"state": "1",
"order": "1",
"remarks": "首页",
"children": null
},
{
"id": 2021002,
"name": "系统管理",
"parentId": null,
"level": "1",
"url": "2222",
"state": "1",
"order": "2",
"remarks": "系统管理",
"children": [
{
"id": 2021019,
"name": "用户管理",
"parentId": 2021002,
"level": "2",
"url": null,
"state": "1",
"order": "1",
"remarks": "用户管理",
"children": null
},
{
"id": 2021020,
"name": "角色管理",
"parentId": 2021002,
"level": "2",
"url": null,
"state": "1",
"order": "2",
"remarks": "角色管理",
"children": null
},
{
"id": 2021021,
"name": "菜单管理",
"parentId": 2021002,
"level": "2",
"url": null,
"state": "1",
"order": "3",
"remarks": "菜单管理",
"children": null
}
]
},
{
"id": 2021003,
"name": "调试",
"parentId": null,
"level": "1",
"url": "/liu/666",
"state": "1",
"order": "3",
"remarks": "调试",
"children": [
{
"id": 2021013,
"name": "模块调试",
"parentId": 2021003,
"level": "2",
"url": null,
"state": "1",
"order": "1",
"remarks": "模块调试",
"children": null
},
{
"id": 2021014,
"name": " 系统调试",
"parentId": 2021003,
"level": "2",
"url": null,
"state": "1",
"order": "2",
"remarks": " 系统调试",
"children": null
}
]
},
{
"id": 2021004,
"name": "数据修改",
"parentId": null,
"level": "1",
"url": "/juese",
"state": "1",
"order": "4",
"remarks": "数据修改",
"children": [
{
"id": 2021015,
"name": " 代码修改",
"parentId": 2021004,
"level": "2",
"url": null,
"state": "1",
"order": "1",
"remarks": " 代码修改",
"children": null
},
{
"id": 2021016,
"name": " 数据修改",
"parentId": 2021004,
"level": "2",
"url": null,
"state": "1",
"order": "2",
"remarks": " 数据修改",
"children": null
}
]
},
{
"id": 2021005,
"name": "部署",
"parentId": null,
"level": "1",
"url": "/ceshi",
"state": "1",
"order": "5",
"remarks": "部署",
"children": [
{
"id": 2021017,
"name": "代码部署",
"parentId": 2021005,
"level": "2",
"url": null,
"state": "1",
"order": "1",
"remarks": "代码部署",
"children": null
},
{
"id": 2021018,
"name": " 数据部署",
"parentId": 2021005,
"level": "2",
"url": null,
"state": "1",
"order": "2",
"remarks": " 数据部署",
"children": null
}
]
},
{
"id": 2021006,
"name": "系统测试",
"parentId": null,
"level": "1",
"url": null,
"state": "1",
"order": "6",
"remarks": "系统测试",
"children": [
{
"id": 2021010,
"name": "文件测试",
"parentId": 2021006,
"level": "2",
"url": null,
"state": "1",
"order": "1",
"remarks": "文件测试",
"children": null
},
{
"id": 2021011,
"name": "Jmeter测试",
"parentId": 2021006,
"level": "2",
"url": null,
"state": "1",
"order": "2",
"remarks": "Jmeter测试",
"children": null
},
{
"id": 2021012,
"name": "模块批量测试",
"parentId": 2021006,
"level": "2",
"url": null,
"state": "1",
"order": "3",
"remarks": "模块批量测试",
"children": null
}
]
},
{
"id": 2021007,
"name": "流程工单",
"parentId": null,
"level": "1",
"url": null,
"state": "1",
"order": "7",
"remarks": "流程工单",
"children": null
},
{
"id": 2021008,
"name": "工作报告",
"parentId": null,
"level": "1",
"url": null,
"state": "1",
"order": "8",
"remarks": "工作报告",
"children": null
},
{
"id": 2021009,
"name": "运维",
"parentId": null,
"level": "1",
"url": null,
"state": "1",
"order": "9",
"remarks": "运维",
"children": null
}
]
}