Loading... <div class="tip share">请注意,本文编写于 759 天前,最后修改于 59 天前,其中某些信息可能已经过时。</div> > 对多级菜单的一次递归查询封装,业务简单,只为记录。 MySQL 表结构  假设我们的数据库如下  展示出来就是这样一个结构 > - 后端语言 > - java > - spring > - python > - 运维技术 > - linux > - docker 接下来我们基于 SpringBoot + Mybatis 来完成这个业余。 实体类很简单,与数据库字段对应即可。  我们要对他进行封装成**带有下一级**的实体 vo 类,用于前端展示,`LevelCatalogVo` 在 `LevelCatalog` 原有的基础上加上了 `List<LevelCatalogVo>` 属性  首先查询出所有的分类内容,之后不再查询多次数据库,减少与数据库交互。 ```Java public List<LevelCatalogVo> info() { //取出所有的内容 List<LevelCatalog> levelCatalogs = baseMapper.selectList(null); //创建一个需要返回的vo展示集合对象 List<LevelCatalogVo> levelCatalogVos = new ArrayList<>(); //所有内容进行遍历 for (LevelCatalog levelCatalog : levelCatalogs) { //找出一级分类,赋值到vo类,加入到集合中去 if (levelCatalog.getParentId() == 0){ LevelCatalogVo levelCatalogVo = new LevelCatalogVo(); BeanUtils.copyProperties(levelCatalog,levelCatalogVo); //为分类设置子分类 levelCatalogVo.setChildren(getChildrens(levelCatalogVo,levelCatalogs)); levelCatalogVos.add(levelCatalogVo); } } return levelCatalogVos; } ``` 为每级分类设置子分类,这里可以才有递归的方式 ```Java private List<LevelCatalogVo> getChildrens(LevelCatalogVo root, List<LevelCatalog> levelCatalogs) { //由于子分类下可能还有子分类,因此依旧需要创建一个需要返回的vo展示集合对象 List<LevelCatalogVo> levelCatalogVos = new ArrayList<>(); //依旧将所有内容进行遍历 for (LevelCatalog levelCatalog : levelCatalogs) { //取出相应子类,加到集合中并返回 if (root.getId().equals(levelCatalog.getParentId())){ LevelCatalogVo levelCatalogVo = new LevelCatalogVo(); BeanUtils.copyProperties(levelCatalog,levelCatalogVo); //使用递归,循序渐进式设置完各大小级分类 levelCatalogVo.setChildren(getChildrens(levelCatalogVo,levelCatalogs)); //加入到子分类集合 levelCatalogVos.add(levelCatalogVo); } } return levelCatalogVos; } ``` 返回的 JSON 信息如下  --- --- > 使用 Mybatis xml 的方式 这种就简单的多了,Mybatis 会帮我们做好一切,但是**他对 Mysql 的查询是多次的**,在数据量超大的情况下性能会大打折扣。 ```xml <resultMap id="result" type="com.xn2001.entity.LevelCatalogVo"> <id column="id" property="id"/> <result column="name" property="name"/> <collection property="children" column="id" ofType="com.xn2001.entity.LevelCatalogVo" select="info2"/> </resultMap> <select id="info2" resultMap="result"> select id, name, parent_id from level_catalog where parent_id = #{parentId} </select> ``` > 可以通过提高内存大小,减少 FGC 次数,也可以通过 Redis 缓存来提高性能。 Last modification:June 17, 2022 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 如果觉得我的文章对你有用,请随意赞赏