java递归查询三级菜单
【摘要】 以上小编学习开发中使用&总结,如果对你有帮助就帮忙点个小赞(^人^),如有侵权联系小编!
方式一:纯SQL查询树状菜单
@Data
public class Menu {
private String menuid; //主键ID
private String menuname; //菜单名称
private String parentid; //上一级菜单
private List<Menu> menus; //子菜单列表
}
<resultMap id="menuMap" type="com.ying.model.Menu">
<id column="menuid" property="menuid"/>
<result column="menuname" property="menuname"/>
<result column="parentid" property="parentid"/>
<collection property="menus" ofType="com.ying.model.Menu" column="menuid" select="findMenuByParentId"/>
</resultMap>
<select id="getRootMenu" resultMap="menuMap">
SELECT * FROM menu WHERE parentid ='' or parentid is NULL
</select>
<select id="findMenuByParentId" parameterType="java.lang.String" resultMap="menuMap">
SELECT * from menu where parentid = #{parentid}
</select>
@Resource
private MenuMapper menuMapper;
/**
* sql 查询三级菜单
*
* @return
*/
public List<Menu> getf() {
long start = System.currentTimeMillis();
Menu rootMenu = menuMapper.getRootMenu();
List<Menu> menuByParentId = menuMapper.findMenuByParentId(rootMenu.getMenuid());
long end = System.currentTimeMillis();
System.out.println("sql查询三级菜单耗时:" + (end - start));
return menuByParentId;
}
方式二:单条递归查询树状菜单
<select id="queryAll" resultType="com.ying.model.Menu">
select * from menu where parentid=#{menuid}
</select>
public Menu getmm() {
long start = System.currentTimeMillis();
Menu rootMenu = menuMapper.getRootMenu(); //查询最大的那个根菜单
Menu menu = recursiveTree(rootMenu);
long end = System.currentTimeMillis();
System.out.println("递归单条查询三级菜单耗时:" + (end - start));
return menu;
}
public Menu recursiveTree(Menu rootNode) {
List<Menu> childNodes = getChildren(rootNode);
if (childNodes != null) {
for (Menu childNode : childNodes) {
recursiveTree(childNode);
}
rootNode.setMenus(childNodes);
}
return rootNode;
}
public List<Menu> getChildren(Menu node) {
List<Menu> childNodes = menuMapper.queryById(node.getMenuid());
return childNodes;
}
方式三:一次性递归查询树状菜单
<select id="queryAllList" resultType="com.ying.model.Menu">
select * from menu
</select>
public List<Menu> queryCategory() {
long start = System.currentTimeMillis();
// 1. 查出所有分类
List<Menu> entities = menuMapper.queryAllList();
// 2. 组装成父子的树形结构
// 2.1 找到所有的一级分类
List<Menu> level1Menus = entities.stream().filter(categoryEntity ->
categoryEntity.getMenuid().equals("0")).map(menu -> {
// 2.2 设置子菜单
menu.setMenus(getChildren(menu, entities));
return menu;
// 2.3 排序
}).collect(Collectors.toList());
long end = System.currentTimeMillis();
System.out.println("递归全部查询三级菜单耗时:" + (end - start));
return level1Menus;
}
/**
* 递归查找所有菜单的子菜单
*/
private List<Menu> getChildren(Menu root, List<Menu> all) {
List<Menu> children = all.stream().filter(categoryEntity ->
categoryEntity.getParentid().equals(root.getMenuid())
).map(categoryEntity -> {
// 1. 找到子菜单
categoryEntity.setMenus(getChildren(categoryEntity, all));
return categoryEntity;
}).collect(Collectors.toList());
return children;
}
public List<Menu> queryCategory() {
long start = System.currentTimeMillis();
// 1. 查出所有分类
List<Menu> entities = menuMapper.queryAllList();
// 2. 组装成父子的树形结构
// 2.1 找到所有的一级分类
List<Menu> level1Menus = entities.stream().filter(categoryEntity ->
categoryEntity.getMenuid().equals("0")).map(menu -> {
// 2.2 设置子菜单
menu.setMenus(getChildren(menu, entities));
return menu;
// 2.3 排序
}).collect(Collectors.toList());
查询结果耗时 :
递归全部查询三级菜单耗时:28
递归单条查询三级菜单耗时:1607
sql查询三级菜单耗时:1465
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)