java递归查询三级菜单

举报
小影 发表于 2022/04/01 10:27:39 2022/04/01
【摘要】 以上小编学习开发中使用&总结,如果对你有帮助就帮忙点个小赞(^人^),如有侵权联系小编!

方式一:纯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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。