递归查询树形结构数据

本文介绍了如何通过MyBatis进行递归查询来处理树形结构的数据,首先展示了数据库表`t_domain`的创建和初始化数据,接着详细列举了实体类、Mapper代码以及具体的方法实现,最后提供了测试代码来验证递归查询的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.初始化数据库数据

DROP TABLE IF EXISTS `t_domain`;
CREATE TABLE `t_domain` (
  `id` varchar(36) NOT NULL,
  `domain_name` varchar(20) NOT NULL COMMENT '区划名称',
  `parent_domain_id` varchar(36) DEFAULT NULL COMMENT '父区划id',
  `domain_type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '区划类型 1销售区划 2运营区划',
  `data_status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1:正常,2:冻结,3:删除',
  `create_time` datetime DEFAULT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='区划表';

-- ----------------------------
-- Records of t_domain
-- ----------------------------
INSERT INTO `t_domain` VALUES ('0', '全国', null, '1', '1', null, '2019-03-15 11:28:16');
INSERT INTO `t_domain` VALUES ('2042bbee-9688-4741-bd9e-6579f186531a', '湘潭', 'dd7460f7-019e-45b9-ab16-44f2bc12a132', '2', '1', '2019-03-06 00:24:30', '2019-03-06 14:24:29');
INSERT INTO `t_domain` VALUES ('544897dc-bb5b-4f22-8483-19e89175f00e', '祁东1hao', 'd5d63419-3e81-406c-8993-0a4f5f943fc8', '1', '1', '2019-03-05 01:35:37', '2019-03-05 15:40:05');
INSERT INTO `t_domain` VALUES ('67bf668a-35cc-4051-90a0-5f4a78251d59', '长沙', 'a8d20afd-6759-49d4-ac0b-c71214b7546b', '1', '1', '2019-03-05 00:36:39', '2019-03-05 14:36:39');
INSERT INTO `t_domain` VALUES ('68639fd5-1deb-4975-bc9f-c516739b4ebd', '山东大区', '0', '1', '1', '2019-03-05 00:15:04', '2019-03-05 14:15:04');
INSERT INTO `t_domain` VALUES ('6ab58032-2df5-4edc-a4e5-8f8b6d45ead8', '祁东2hao', 'd5d63419-3e81-406c-8993-0a4f5f943fc8', '1', '1', '2019-03-05 00:42:23', '2019-03-05 15:40:09');
INSERT INTO `t_domain` VALUES ('a69dbe97-f5ea-4e7c-af34-fd182d413215', '祁东type2', 'd5d63419-3e81-406c-8993-0a4f5f943fc8', '2', '1', '2019-03-05 02:54:15', '2019-03-05 16:54:15');
INSERT INTO `t_domain` VALUES ('a8d20afd-6759-49d4-ac0b-c71214b7546b', '湖南大区', '0', '1', '1', '2019-03-05 00:35:18', '2019-03-05 14:35:18');
INSERT INTO `t_domain` VALUES ('c64f09e5-9bb8-4099-b27c-14c8176cfd82', '湘潭', 'a8d20afd-6759-49d4-ac0b-c71214b7546b', '2', '1', '2019-03-05 02:55:38', '2019-03-05 16:55:38');
INSERT INTO `t_domain` VALUES ('d5d63419-3e81-406c-8993-0a4f5f943fc8', '衡阳', 'a8d20afd-6759-49d4-ac0b-c71214b7546b', '1', '1', '2019-03-05 00:37:08', '2019-03-05 14:37:08');
INSERT IN

/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值