递归算法结合数据库 解析 java树形结构
1、准备表结构及对应的表数据
a、表结构:
- create table TB_TREE
- (
- CID NUMBER not null,
- CNAME VARCHAR2(50),
- PID NUMBER //父节点
- )
b、表数据:
- insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0);
- insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1);
- insert into tb_tree (CID, CNAME, PID) values (3, '广东省', 1);
- insert into tb_tree (CID, CNAME, PID) values (4, '上海市', 1);
- insert into tb_tree (CID, CNAME, PID) values (5, '广州市', 3);
- insert into tb_tree (CID, CNAME, PID) values (6, '深圳市', 3);
- insert into tb_tree (CID, CNAME, PID) values (7, '海珠区', 5);
- insert into tb_tree (CID, CNAME, PID) values (8, '天河区', 5);
- insert into tb_tree (CID, CNAME, PID) values (9, '福田区', 6);
- insert into tb_tree (CID, CNAME, PID) values (10, '南山区', 6);
- insert into tb_tree (CID, CNAME, PID) values (11, '密云县', 2);
- insert into tb_tree (CID, CNAME, PID) values (12, '浦东', 4);
2、TreeNode对象,对应tb_tree
- public class TreeNode implements Serializable {
- private Integer cid;
- private String cname;
- private Integer pid;
- private List nodes = new ArrayList();
- public TreeNode() {
- }
- //getter、setter省略
- }
3、测试数据
- public class TreeNodeTest {
- @Test
- public void loadTree() throws Exception{
- System.out.println(JsonUtils.javaToJson(recursiveTree(1)));
- }
- /**
- * 递归算法解析成树形结构
- *
- * @param cid
- * @return
- * @author jiqinlin
- */
- public TreeNode recursiveTree(int cid) {
- //根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?)
- TreeNode node = personService.getreeNode(cid);
- //查询cid下的所有子节点(SELECT * FROM tb_tree t WHERE t.pid=?)
- List childTreeNodes = personService.queryTreeNode(cid);
- //遍历子节点
- for(TreeNode child : childTreeNodes){
- TreeNode n = recursiveTree(child.getCid()); //递归
- node.getNodes().add(n);
- }
- return node;
- }
- }
输出的json格式如下:
- {
- "cid": 1,
- "nodes": [
- {
- "cid": 2,
- "nodes": [
- {
- "cid": 11,
- "nodes": [
- ],
- "cname": "密云县",
- "pid": 2
- }
- ],
- "cname": "北京市",
- "pid": 1
- },
- {
- "cid": 3,
- "nodes": [
- {
- "cid": 5,
- "nodes": [
- {
- "cid": 7,
- "nodes": [
- ],
- "cname": "海珠区",
- "pid": 5
- },
- {
- "cid": 8,
- "nodes": [
- ],
- "cname": "天河区",
- "pid": 5
- }
- ],
- "cname": "广州市",
- "pid": 3
- },
- {
- "cid": 6,
- "nodes": [
- {
- "cid": 9,
- "nodes": [
- ],
- "cname": "福田区",
- "pid": 6
- },
- {
- "cid": 10,
- "nodes": [
- ],
- "cname": "南山区",
- "pid": 6
- }
- ],
- "cname": "深圳市",
- "pid": 3
- }
- ],
- "cname": "广东省",
- "pid": 1
- },
- {
- "cid": 4,
- "nodes": [
- {
- "cid": 12,
- "nodes": [
- ],
- "cname": "浦东",
- "pid": 4
- }
- ],
- "cname": "上海市",
- "pid": 1
- }
- ],
- "cname": "中国",
- "pid": 0
- }
递归算法结合数据库 解析 java树形结构的更多相关文章
- 使用递归算法结合数据库解析成java树形结构
使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...
- 数据库索引 引用树形结构 B-数 B+数
MySQL 为什么使用B+数 B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所谓 ...
- java树形结构工具类
一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...
- Access数据库一种树形结构的实现和子节点查询
BOOL CManageDataBase::GetDepTreeAllSons( int rootItem ) { CADORecordset Rst(&m_DataBase); BOOL b ...
- EasyUI_tree根据数据库数据生成树形结构JSON格式
@Entitypublic class PubComp { @Id private String aguid; // 菜单ID private String pguid; // 父菜单 private ...
- 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一、Adjacency List)
今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢? 像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了. 举个栗子:现在有一 ...
- 树形结构的数据库表Schema设计-基于左右值编码
树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的 ...
- 树形结构表的存储【转自:http://www.cnblogs.com/huangfox/archive/2012/04/11/2442408.html】
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...
- Mysql通过Adjacency List(邻接表)存储树形结构
转载自:https://www.jb51.net/article/130222.htm 以下内容给大家介绍了MYSQL通过Adjacency List (邻接表)来存储树形结构的过程介绍和解决办法,并 ...
随机推荐
- VMware扩展Linux根目录磁盘空间(Centos版本)
1.Centos 关机,选择编辑虚拟机设置,硬盘,在实用工具那里选择“扩展”,指定你需要的存储大小 2.启动客户机操作系统Centos,查看磁盘情况 输入指令 fdisk -l 显示结果如下 Disk ...
- 最全spring boot视频系列,你值得拥有
================================== 从零开始学Spring Boot视频 ================================== àSpringBoot ...
- [Unity插件]Lua行为树(十三):装饰节点完善
之前介绍了组合节点中三大常用的节点:BTSequence.BTSelector和BTParallel,一般来说,这三种就够用了,可以满足很多的需求. 接下来可以完善一下装饰节点,增加几种新的节点. 1 ...
- 温故而知新-robots.txt语法教程
用几个最常见的情况,直接举例说明: 1. 允许所有SE收录本站:robots.txt为空就可以,什么都不要写. 2. 禁止所有SE收录网站的某些目录: User-agent: * Disall ...
- github中SSH公钥的生成与添加
在终端中输入ssh-keygen -t rsa -C "133XXXXXX@qq.com" 按3个回车,密码为空这里一般不使用密钥. 最后得到了两个文件:id_rsa和id_rsa ...
- 键值对操作 之 combineByKey
combineByKey( createCombiner,mergeValue,mergeCombiners,partitioner) combineByKey() 是最为常用的基于键进行聚合的函数. ...
- 3. orcle导入导出dmp文件并更改表空间
0.数据泵导入导出: expdp test/test@10.0.0.11/orcl schemas=test dumpfile=test.dmp directory=DPDATA logfile= ...
- Android Camera2的使用
参考:https://developer.android.com/reference/android/hardware/camera2/package-summary.html camera2提供了一 ...
- 转载:python 的包导入
python 包 多个关系密切的模块应该组织成一个包,以便于维护和使用.这项技术能有效避免名字空间冲突.创建一个名字为包名字的文件夹并在该文件夹下创建一个__init__.py 文件就定义了一个包.你 ...
- c#调用带输出参数的存储过程
sql server中编写一个存储过程: CREATE PROCEDURE ProGetPWD @username varchar(20), @password varchar(20) OUTPUT ...