查询生成二级树型结构最高效的方式
一般后台导航菜单为两层的树形结构,一般查询的思路是递归或者双重for循环,最高效的方式是通过引用类型对象的特点,引用类型存的是对象地址
递归查询核心代码:直接在sql中查询生成树 可以实现多级树 效率较低
<resultMap id="BaseResultMap" type="org.sang.bean.Menu"> <id property="id" column="id"/> <result column="name" property="name"/> <result column="parentId" property="parentId"/> <collection property="children" ofType="org.sang.bean.Menu" select="org.sang.mapper.MenuMapper.getMenuByPid" column="id"> </collection> </resultMap> <select id="getMenuByPid" resultMap="BaseResultMap"> select d1.* from menu d1 where d1.`parentId`=#{pid} AND d1.enabled=true; </select>
双重for循环查询思路:实现二层树的常规思路,算法时间复杂度O(n^2)
public List<Menu> getMenuTree(){ List<Menu> menus = menuDao.getAllMenu(); //查询所有菜单 List<Menu> firstMenu = new ArrayList<>(); for(Menu menu:menus){ //双重循环生成树 if(menu.getParentId() == null){ for(Menu menu2:menus){ if(menu2.getParentId() == menu.getId()){ menu.getChildren().add(menu2); } } firstMenu.add(menu); } } return firstMenu; }
最高效的方式:通过引用类型对象的特点,引用类型存的是对象地址,算法时间复杂度2O(n)
public List<Menu> getMenuTree(){ List<Menu> menus = menuDao.getAllMenu(); //查询所有菜单 List<Menu> firstMenu = new ArrayList<>(); Map<Integer, Menu> menuMap = new HashMap<>(); for(Menu menu:menus){ if(menu.getParentId() == null){ //一级菜单 firstMenu.add(menu) } menuMap.put(menu.getId, menu); } for(Menu menu:menus){ if(menu.getParentId() != null && menuMap.containsKey(menu.getParentId())){ menuMap.get(menu.getParentId()).getChildren().add(menu); } menuMap.put(menu.getId, menu); } return firstMenu; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)