请注意,本文编写于 1351 天前,最后修改于 651 天前,其中某些信息可能已经过时。
对多级菜单的一次递归查询封装,业务简单,只为记录。
MySQL 表结构
假设我们的数据库如下
展示出来就是这样一个结构
后端语言
java
- spring
- python
运维技术
- linux
- docker
接下来我们基于 SpringBoot + Mybatis 来完成这个业余。
实体类很简单,与数据库字段对应即可。
我们要对他进行封装成带有下一级的实体 vo 类,用于前端展示,LevelCatalogVo
在 LevelCatalog
原有的基础上加上了 List<LevelCatalogVo>
属性
首先查询出所有的分类内容,之后不再查询多次数据库,减少与数据库交互。
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;
}
为每级分类设置子分类,这里可以才有递归的方式
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 的查询是多次的,在数据量超大的情况下性能会大打折扣。
<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 缓存来提高性能。
版权属于:乐心湖's Blog
本文链接:https://www.xn2001.com/archives/525.html
声明:博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!