Mybatis实现树形结构方式

 1,三级分类树形结构查询

/*** DDD(Domain-Driven Design): 领域驱动设计** 三级分类树形结构;* 支持无限层级;* 当前项目只有三级*/
@Data
public class CategoryTreeTo {private  Long categoryId; //1private String categoryName;private List<CategoryTreeTo>  categoryChild;//子分类
}
   <!--    定义Category树形封装规则; 三级固定封装--><resultMap id="CategoryTreeRM" type="com.azxc.rapid.modules.main.dto.CategoryTreeTo"><!--     一级分类的规则   --><id column="id" property="categoryId"></id><result column="name" property="categoryName"></result><collection property="categoryChild"ofType="com.azxc.rapid.modules.main.dto.CategoryTreeTo"><!--  二级分类封装规则 --><id column="c2_id" property="categoryId"></id><result column="c2_name" property="categoryName"></result><collection property="categoryChild"ofType="com.azxc.rapid.modules.main.dto.CategoryTreeTo"><!--  三级分类封装规则 --><id column="c3_id" property="categoryId"></id><result column="c3_name" property="categoryName"></result></collection></collection></resultMap><select id="getTest" resultMap="CategoryTreeRM">select bc1.*,bc2.id   c2_id,bc2.name c2_name,bc2.category1_id,bc3.id   c3_id,bc3.name c3_name,bc3.category2_idfrom base_category1 bc1left join base_category2 bc2 on bc1.id = bc2.category1_idleft join base_category3 bc3 on bc2.id = bc3.category2_id</select>

执行结果展示

 

 2,树形结构(递归遍历)

    @Overridepublic List<Permission> getTest1() {//查询所有菜单List<Permission> res = baseMapper.getTest1();return build(res);}/*** 根据权限列表构建父子关系** @param permissionList* @return*/public static List<Permission> build(List<Permission> permissionList) {List<Permission> menu = new ArrayList<>();for (Permission permission : permissionList) {//判断当前菜单是否是以及菜单if (permission.getParentId() == 0) {//一级菜单//2.1 设置一级菜单的子菜单列表permission.setChildren(getChildren(permission, permissionList));//2.2 将一级菜单添加到菜单列表中menu.add(permission);}}return menu;}/*** 从原始菜单中获取某个权限的子菜单列表** @param permission* @param originPermissionList* @return*/private static List<Permission> getChildren(Permission permission, List<Permission> originPermissionList) {//1. 创建一个新的集合,用来存储子菜单List<Permission> children = new ArrayList<>();//1. 遍历出原始菜单中的每一个权限for (Permission child : originPermissionList) {//1.1 如果originPermission的父id等于permission的idif (permission.getId().equals(child.getParentId())) {//originPermission是permission的子菜单,则将originPermission添加到children中// 子菜单还有没有子菜单呢?child.setChildren(getChildren(child, originPermissionList));children.add(child);}}return children;}

结果 :

 表结构:树形结构

3,数据字典

需求效果图

 表结构:树形结构

 1.xml

    <select id="findListByParentId" resultType="com.atguigu.entity.Dict"><include refid="columns"></include>from hse_dictwhere parent_id = #{parentId} and is_deleted = 0</select>

2.业务层

    @Overridepublic List<Map<String, Object>> findZnodes(Long id) {//根据id查询对应的子分类List<Dict> dictList = dictMapper.findListByParentId(id);//使用Stream API将dictList转换为Map集合List<Map<String, Object>> zNodes = dictList.stream().map(dict -> {Map<String, Object> responseMap = new HashMap<>();//表示当前节点是否还有子节点,以当前节点的id到hse_dict表中查询子节点的数量,如果大于0,则表示当前节点还有子节点Integer count = dictMapper.countIsParent(dict.getId());responseMap.put("isParent", count > 0);//表示当前节点的名称responseMap.put("name", dict.getName());responseMap.put("id", dict.getId());return responseMap;}).collect(Collectors.toList());return zNodes;}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据(带有Metadata),附常见问题

ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据&#xff08;带有Metadata&#xff09; 文章目录 ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据&#xff08;带有Metadata&#xff09;前言数据下载ENVI 5.3打开Landsat 8 C2L2级别数据ENVI 5.3打开Landsat 9 C2L2级别数据ENVI 6.0打开La…

RDMA介绍

RDMA全称是Remote Direct Memory Access&#xff0c;即远程直接内存访问&#xff0c;是一种高性能网络通信技术&#xff0c;可以使计算机直接访问远端计算机的内存&#xff0c;而无需在本地和远程计算机之间进行数据复制。 相比于传统的网络通信方式&#xff0c;RDMA技术具有更…

手写防抖debounce

手写防抖debounce 应用场景 当需要在事件频繁触发时&#xff0c;只执行最后一次操作&#xff0c;可以使用防抖函数来控制函数的执行频率,比如窗口resize事件和输入框input事件&#xff1b; 这段代码定义了一个名为 debounce 的函数&#xff0c;它接收两个参数&#xff1a;fn…

颠覆传统:探索Web3对传统计算机模式的冲击

随着Web3技术的崛起&#xff0c;传统计算机模式正面临着前所未有的冲击与挑战。Web3作为下一代互联网的代表&#xff0c;以其去中心化、安全可信的特性&#xff0c;正在颠覆着传统计算机模式的种种假设和局限性。本文将深入探讨Web3对传统计算机模式的冲击&#xff0c;并探索其…

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6&#xff0c;想实现pwm输出&#xff0c;但是原电路固定在芯片的引脚PB10和PB11上&#xff0c;查看了下引脚的功能&#xff0c;需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…

PMP应考小技巧有哪些?

首先&#xff0c;制定合理的学习计划。将备考过程分解为小目标&#xff0c;并为每个目标设定截止日期。这样可以帮助我们有条不紊地进行学习&#xff0c;避免拖延和压力过大。 其次&#xff0c;选择适合自己的学习资源。PMP考试教材众多&#xff0c;可以选择一本权威的教材作为…

Idea-Linux远程开发部署

第一步&#xff1a;File->Remote Development 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a;在Host位置填写Linux虚拟机的IP地址&#xff0c;在Username、Password填写对应的账号密码后点击Test Connection测试连接。 第五步&#xff1a; 第六步&#xff1a;在…

项目:仿RabbitMQ实现的消息队列组件

文章目录 写在前面开源仓库和项目上线其他文档说明 需求分析BrokerServer交换机类型持久化消息应答 模块划分服务端模块客户端模块交换机数据管理模块队列数据管理模块绑定数据管理模块消息数据管理模块队列信息管理模块虚拟机数据管理模块路由匹配模块消费者管理模块信道管理模…

做店干货|抖音小店找达人的要求以及渠道

大家好&#xff0c;我是喷火龙。 这么多年&#xff0c;我们做店一直是以达人合作为主&#xff0c;商品卡流量为辅&#xff0c;没有快进快出那一套&#xff0c;我们喜欢追求一个店铺的长期经营&#xff0c;长期产出&#xff0c;我们的逻辑是&#xff0c;产品可以死&#xff0c;…

折半查找二分查找

简介 折半查找也就是二分查找&#xff0c;也可以叫二分法&#xff0c;本质上都是一样的&#xff0c;通过比对中间值与目标值&#xff0c;一次性就能筛掉一半的数字。 举例&#xff1a; 一个猜数字游戏&#xff0c;让你来猜1-100中我选中的数&#xff0c;如果猜中游戏结束&…

elementUI输入框/选项卡与百度地图联动

文章目录 输入框/选项卡与百度地图联动示例html部分用到的插件main.js 输入框/选项卡与百度地图联动 示例 输入框/选项卡与百度地图联动 html部分 <template><el-form ref"Froms" :model"formData" label-width"120px"><el-for…

露营地管理小程序基于ThinkPHP+FastAdmin+UniApp开发

应用介绍 本文来自&#xff1a;露营地管理小程序基于ThinkPHPFastAdminUniApp开发 - 源码1688 基于ThinkPHPFastAdminUniApp开发的现代化的露营地管理小程序&#xff0c;是专为露营业务设计开发小程序应用。平台拥有多角色管理&#xff0c;同时具有营位预定、门票购买等功能模…

【距离四六级只剩一个星期!】刘晓艳四级保命班课程笔记(2)(可分享治资料~)

这一节是专门的听力课程&#xff0c;众所周知&#xff0c;咱们刘晓艳刘老师的口语不是特别的突出&#xff0c;当然口才是一流的☝️。 文章目录 听力预判听前预判 听力过程八大出题关键点视听一致同义转换 听完一道题后平时练习精听步骤 听力预判 听前预判 画关键词&#xff…

融合通信系统 | 让传统通信沟通无边界

随着通信技术以及互联网的发展&#xff0c;融合通信在各行各业中的应用日益增多&#xff0c;融合通信多样的通信方式为行业用户带来了极佳的通信体验&#xff0c;助力各行各业蓬勃发展&#xff0c;同时也为人们的生活和工作带来了极大的便利和效率。 融合通信系统是一种集成多种…

PHP 操作日期各种转换,常见日期转换,涉及聊天时间转换、涉及日周月年转换、涉及到图表日期转换

日期操作 一、根据日期生成日期数组 /*** 根据指定日期生成日期数组* param $start_time 开始时间* param $end_time 结束时间* return array 返回数组结果*/ function createDateArr($start_time, $end_time) {$open_start_time $start_time;$open_end_time $end_ti…

leetcode 1103.分糖果II

思路&#xff1a;模拟 其实就是用num_people取余就行了&#xff0c;如果说特别一点的话&#xff0c;就是candies的判断了。 如果说当前的candies能够分发出来&#xff0c;那么这个candies就按照题目要求分发即可&#xff1b;如果说不够&#xff0c;那么只能分给当前小朋友can…

C语言基础——数组(2)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言 一、二维数组的创建 1.1 二维数组的概念 1.2二维数组的创建 二、二维数组…

岁月情深,爱如初见——我爸爸的老年爱情故事

​在那个泛黄的老相册里&#xff0c;藏着一对青涩的恋人&#xff0c;他们的眼神清澈而坚定&#xff0c;仿佛早已约定了今生的不离不弃。那便是我的爸爸和他的爱人&#xff0c;妈妈。时光荏苒&#xff0c;转眼间&#xff0c;两人已是白发苍苍的老人&#xff0c;但他们的爱情故事…

网络安全中攻击溯源方法

目前网络攻击已经成为常见的安全威胁之一&#xff0c;其造成的危害和损失都是不可估量的&#xff0c;因此网络攻击受到了高度重视。而当我们遭遇网络攻击时&#xff0c;攻击溯源是一项非常重要的工作&#xff0c;可以帮助我们迅速发现并应对各类网络攻击行为&#xff0c;那么网…

Jetpack架构组件_LifeCycle组件

1.LifeCycle组件 LifeCycle组件可以让我们自定义的类能主动感知到Activity、Fragment、Application、Service等系统组件的生命周期。 我们以百度定位为例&#xff0c;我们一般在Activity生命周期的onCreate回调函数里调用自定义类LocationService的Start()方法&#xff0c;在o…