1、实体类
public class MenuEntity {
private String id;
private String name;
private String code;
private String parentId;
// 子菜单
private List<MenuEntity> children;
}
2、XML中写法
1、定义resultMap
<resultMap type="com.entity.MenuEntity" id="menuTree">
<id column="id" property="id"/>
<result column="parentId" property="parentId"/>
<result column="name" property="name"/>
<result column="code" property="code"/>
<collection property="children" javaType="java.util.ArrayList" ofType="com.entity.MenuEntity"
column="id" select="getMenuChildren"/>
</resultMap>
2、XML内调用的查询
<select id="getMenuChildren" resultMap="menuTree">
SELECT
*
FROM
t_menu_fun
WHERE
parentId= #{id}
</select>
3、dao关联的查询
<select id="getTree" resultMap="menuTree">
SELECT
*
FROM
t_menu_fun
WHERE parentId= #{parentId}
</select>
4、dao层方法
List<MenuEntity> getMenuListByPid(String parentId);
3、注意事项
- 步骤(2、3)都是返回的定义的 resultMap
- resultMap中 <collection> 参数property的值与实体类集合名一致 javaType必须规定类型
- resultMap中<collection> 参数select的值为步骤2(调用另个查询,查询对应的子类)
4、Java的处理方式
public class TreeUtils {
/**
* @param parentVal 标识最上层; 例如:parentId= -1 时为最上层
* @param list 所有数据
* @return
*/
public static List<ModelGroup> getTree(String parentVal, List<ModelGroup> list) {
//获取根节点
List<ModelGroup> root = list.stream().filter(item -> parentVal.equals(item.getParentId())).collect(Collectors.toList());
List<ModelGroup> result = new ArrayList<>();
root.forEach(tree -> {
result.add(getChild(tree, list));
});
return result;
}
/**
* 通过递归的方式找出所有子级
*
* @param treeNode
* @param collect
* @return
*/
private static ModelGroup getChild(ModelGroup treeNode, List<ModelGroup> collect) {
ArrayList<ModelGroup> treeNodes = new ArrayList<>();
collect.forEach(node -> {
if (treeNode.getId().equals(node.getParentId())) {
treeNodes.add(getChild(node, collect));
}
});
treeNode.setChildren(treeNodes);
return treeNode;
}
}
希望能帮助到大家、如有问题请在评论区告诉我。