递归查询树形结构数据
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 INTO `t_domain` VALUES ('dd7460f7-019e-45b9-ab16-44f2bc12a132', '湖南大区', '0', '2', '1', '2019-03-06 00:23:06', '2019-03-06 14:23:05');
代码新增数据:
// 分与权限的区划添加,包括销售区划和运营区划
@Test
public void test01(){Example example = new Example(TDomain.class);int totalCount = domainMapper.selectCountByExample(example);if(totalCount == 0){ // 如果表里没数据,加个全国进去TDomain bean = new TDomain();bean.setId("0");bean.setDomainName("全国");bean.setCreateTime(new Date());domainMapper.insertSelective(bean);}// 如果是从全国添加大区,传0,否则就是取当前操作节点的id,如在大区上添加市,传大区的id,String parentId = "a8d20afd-6759-49d4-ac0b-c71214b7546b";// 区划类型 1销售区划 2运营区划int domain_type = 1;TDomain bean = new TDomain();bean.setId(UUID.randomUUID().toString());bean.setDomainName("株洲");bean.setParentDomainId(parentId);bean.setDomainType(domain_type);bean.setCreateTime(new Date());int i = domainMapper.insertSelective(bean);}
2.实体类,省略set,get
@Table(name = "t_domain")
public class TDomain {@Idprivate String id;private String domainName;private String parentDomainId;private Integer domainType;@JSONField(serialize = false)private Integer dataStatus;@JSONField(serialize = false)private Date createTime;@JSONField(serialize = false)private Date updateTime;private List<TDomain> childList = new ArrayList<>();
3.mapper代码
public interface DomainMapper extends Mapper<TDomain> {@Select("SELECT * FROM t_domain WHERE id = #{id} and data_status = 1")List<TDomain> getNode(@Param("id") String id);@Select("SELECT * FROM t_domain WHERE parent_domain_id = #{parentDomainId} and domain_type = #{domainType} and data_status = 1")List<TDomain> getNodeList(@Param("parentDomainId") String parentDomainId, @Param("domainType") int domainType);
4.方法代码及测试结果
@Test
public void test666(){TDomain quhua = recursiveTree("0",1);logger.info(IJsonUtils.toJson(quhua));
}
public TDomain recursiveTree(String id,int domainType) { // id为数据的主键IDTDomain node;List<TDomain> datas = domainMapper.getNode(id);if (datas.isEmpty()){return null;}else{node = datas.get(0);}List<TDomain> childTreeNodes = domainMapper.getNodeList(id,domainType);for(TDomain child : childTreeNodes){TDomain n = recursiveTree(child.getId(),domainType);node.getChildList().add(n);}return node;
}
[
{
"childList": [],
"domainName": "山东大区",
"domainType": 1,
"id": "68639fd5-1deb-4975-bc9f-c516739b4ebd",
"parentDomainId": "0"
},
{
"childList": [
{
"childList": [],
"domainName": "长沙",
"domainType": 1,
"id": "67bf668a-35cc-4051-90a0-5f4a78251d59",
"parentDomainId": "a8d20afd-6759-49d4-ac0b-c71214b7546b"
},
{
"childList": [
{
"childList": [],
"domainName": "祁东1hao",
"domainType": 1,
"id": "544897dc-bb5b-4f22-8483-19e89175f00e",
"parentDomainId": "d5d63419-3e81-406c-8993-0a4f5f943fc8"
},
{
"childList": [],
"domainName": "祁东2hao",
"domainType": 1,
"id": "6ab58032-2df5-4edc-a4e5-8f8b6d45ead8",
"parentDomainId": "d5d63419-3e81-406c-8993-0a4f5f943fc8"
}
],
"domainName": "衡阳",
"domainType": 1,
"id": "d5d63419-3e81-406c-8993-0a4f5f943fc8",
"parentDomainId": "a8d20afd-6759-49d4-ac0b-c71214b7546b"
}
],
"domainName": "湖南大区",
"domainType": 1,
"id": "a8d20afd-6759-49d4-ac0b-c71214b7546b",
"parentDomainId": "0"
}
]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
使用mybatis自带递归查询功能实现:
1.mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--suppress SqlDialectInspection -->
<mapper namespace="com.wd.dao.privilege.DomainMapper"><resultMap id="SaleResult" type="com.wd.domain.po.TDomain"><id column="id" property="id"/><result column="domain_name" property="domainName" /><result column="parent_domain_id" property="parentDomainId" /><result column="domain_type" property="domainType" /><result column="data_status" property="dataStatus" /><result column="create_time" property="createTime" /><result column="update_time" property="updateTime" /><collection column="id" property="childList"ofType="com.wd.domain.po.TDomain"select="listForSale"></collection></resultMap><resultMap id="OperationResult" type="com.wd.domain.po.TDomain"><id column="id" property="id"/><result column="domain_name" property="domainName" /><result column="parent_domain_id" property="parentDomainId" /><result column="domain_type" property="domainType" /><result column="data_status" property="dataStatus" /><result column="create_time" property="createTime" /><result column="update_time" property="updateTime" /><collection column="id" property="childList"ofType="com.wd.domain.po.TDomain"select="listForOperation"></collection></resultMap><!--注意,递归查询只能跟一个条件--><!-- 递归查询所有,传最外层节点的parent_id值,数据库里的值,不能是null,比如定义parent_id=0表示最外层--><!--销售区划树查询--><select id="listForSale" resultMap="SaleResult">select * from t_domain where parent_domain_id = #{parentDomainId} and domain_type = 1;</select><!--运营区划树查询--><select id="listForOperation" resultMap="OperationResult">select * from t_domain where parent_domain_id = #{parentDomainId} and domain_type = 2;</select></mapper>
2.mapper代码
/*** 递归查询销售区划树** @param parentDomainId 传大区的parentDomainId,0哦,不能是null* @return*/
List<TDomain> listForSale(@Param("parentDomainId") String parentDomainId);/*** 递归查询运营区划树** @param parentDomainId 传大区的parentDomainId,0哦,不能是null* @return*/
List<TDomain> listForOperation(@Param("parentDomainId") String parentDomainId);
3.测试代码
// 销售区划树查询
@Test
public void test02(){String parentDomainId = "0";List<TDomain> domains = domainMapper.listForSale(parentDomainId);String json = IJsonUtils.toJson(domains);logger.info(json);
}// 运营区划树查询
@Test
public void test03(){String parentDomainId = "0";List<TDomain> domains = domainMapper.listForOperation(parentDomainId);String json = IJsonUtils.toJson(domains);logger.info(json);
}
递归查询树形结构数据相关推荐
- Java递归查询某个节点下所有子节点多级信息(递归部门查询,递归树形结构数据查询)
前言 在做项目中我们会遇到树形结构数据,如果我们想要查询某个几点下面所有子节点(多级)数据,此时我们又不知道下面有多少级节点以及节点ID,那么我们就需要使用递归去查询了,当然在数据库中写函数也是可以实 ...
- Java 递归查询部门树形结构数据
说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1.数据库表:department 2.编写sql映射语句 <select id=&quo ...
- oracle树状结构递归,Oracle:递归查询(树形结构数据)
Oracle树形结构数据-相关知识总结 Oracle树形结构数据--基本知识 1.数据组成 2.基本查询 2.1.查询某节点及该节点下的所有子孙节点 SELECT * FROM QIAN ...
- java递归实现树形结构数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.树形结构是什么? 二.实现方案 1.stream流递归实现 1.1 实体类 1.2 实现类 2.jdk1.7以下实 ...
- Java 树形结构数据生成--不需要顶级节点
概要 树形结构数据是后台开发中非常常见的一种数据结构.后台管理系统中必要的一种结构,常见的树形结构数据有,部门树,权限树等等,利用该数据结构可以让你的系统数据展示一目了然,并且为分配这些数据也提供了极 ...
- php 处理树形数据,php实现的树形结构数据存取类实例
php实现的树形结构数据存取类实例 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: php实现的树形结构数据存取类实例.txt ] (友情提示:右键点上行txt文档 ...
- 构建树形结构数据(全部构建,查找构建)C#版
摘要: 最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控件. 一.遇到的问题 获取全部任务拼接树形速度过慢(数据量大约在900条左右)且查询速度 ...
- 树形结构数据, 已知某一子节点 ,一次向上获取所有父节点
树形结构数据, 已知某一子节点 ,一次向上获取所有父节点 //tree: 树形结构, menuid: 已知节点属性,(代码中判断id相等) function treeFindPath(tree, me ...
- js过滤树形结构数据并获取新的树形结构
工作中不时会遇见对树形结构数据的处理,有时候只需要遍历并获取其中一个属性值就行了(这部分内容请参考笔者的另一篇博客JS遍历树形结构方法),有时候我们则需要根据某些条件去过滤并得到新的树形结构数据. l ...
最新文章
- Info:Memory module [DIMM] needs attention: Single-bit warning error rate exceeded, Single-bit fai...
- python统计代码行数
- Leetcode 147.对链表进行排序
- java二叉树的序列化_二叉树的序列化和反序列化
- Linux入门之磁盘管理(3)文件系统挂载
- 【斜率优化】[CEOI2004]锯木厂选址——从这里开始斜率优化的大门
- 糖葫芦低通滤波器的设计
- r访问oracle数据库,R学习笔记之访问远程Oracle数据库
- 快速设置Revit模型材质(Dynamo和API)
- Linux CentOS7.0 使用root登录桌面
- 安装Matlab R2022a/64位
- Linux 使用nohup命令运行python文件
- root程序拆卸,把root软件删了
- 计算机绘图综合训练铣刀头实训报告,cad计算机绘图教学方案总结.docx
- Android变脸幕后的魔法师:各巨头…
- 人力资源系统技术标准
- 深度学习领域最新成果——“动态外科手术”算法
- Python-入门-函数(九)
- 抓取微信小程序数据包的三种方法
- iOS 支付宝页面无法跳转
热门文章
- 解决html5语意标签在IE低版本浏览器下的兼容问题:
- S5PV210_流水灯
- 贪心算法(一)假背包问题,圣诞老人的礼物
- #个人日记-电影《哆啦A梦:伴我同行2》观后感-20210530
- 码一些有用的东西网站的域名被拦截怎么办? 教你快速解除各种拦截
- linux tar 打包 解压包
- Google Earth Engine ——MOD11A1/A2 V6产品Emis_31和32波段下载
- 动态库链接boost静态库
- java中的jsp文件创建_在JSP中创建文件夹和文件
- PCIe 6.0时代即将到来 你准备好了吗?