实现多级分类嵌套数据的展示
时间:2022-07-22
本文章向大家介绍实现多级分类嵌套数据的展示,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先可以看一下这个表结构。
假设我们的内容拥有
展示出来就是这样一个结构
- 后端语言
- java
- spring
- python
- java
- 运维技术
- linux
- docker
接下来我们基于 SpringBoot + Mybatis 来完成这个业余。
我将展示 xml 和 Java代码 两种方式。
实体类
我们要对他进行封装成带有下一级的实体Vo
我新建了一个 LevelCatalogVo 在 LevelCatalog 原有的基础上加上了 List<LevelCatalogVo>
属性
接下来我们去写这个 APi 接口
我们去 Service 层中写具体的逻辑实现了。
这个是主要方法:查询出所有的内容,然后通过代码我们一一来封装成对象,这样我们对MySQL的查询只有一次。
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;
}
完成 controller 层调用后,访问得到的信息正如我们所需。
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>
- 存储过程和触发器的应用
- 两部委印发车联网产业标准体系建设指南 提到了自动驾驶
- 状态开关按钮ToggleButton
- 微软开放 .NET 框架源代码
- Angularjs基础(十二)
- 妙趣横生的HTML5 Page Visibility API
- 禁止/移除 WordPress 4.2 中前台自动加载的 emjo 脚本
- 项目管理方面的几个.NET开源项目
- 如何向十岁以下的朋友解释编程?这个说法碉堡了!
- 快速比较和合并文件
- 前端页面中 iOS 版微信长按识别二维码的bug 与解决方案
- .NET Mass Downloader -整体下载.NET源码
- Android中Button
- Pycharm中一些不为人知的技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法