数据库中的树形结构 - JAVA 设计 (通用)
我们通常会在应用中碰到树形结构的内容,比如 文件夹/文件模型, 部门组织结构,目录树等等,通常在设计模式中叫做 compose 模式。
在数据库中常常这样表示: 我们以Catalog (分级目录) 为例子
Catalog (分级目录)
字段名称
字段
类型
备注
目录ID
catalog_id
varchar(36)
pk, not null
目录名称
catalog_name
varchar(50)
not null
父目录ID
parent_id
varchar(36)
fk
创建时间
create_datetime
datetime
not null
目录描述
description
varchar(200)
?
我们考虑在数据库中一次将所有数据读入内存,然后在内存中生成一个Tree,这样可以减少数据库的访问,增加性能,并且只有的数据方式改变的时候,全部重新从数据库中生成Tree,否则一直保持在内存中。
我们使用标准的DAO模式先生成 POJO类(Catalog)和DAO类(CatalogDAO)。
然后我们建立相对通用的 Tree 和 TreeNode 类。
Tree.java
?
?
?
TreeNode.java
?
package com.humpic.helper.tree;import java.util.List;import org.apache.commons.collections.Predicate;public class CatalogTree extends Tree { private static CatalogTree instance = null; private CatalogTree() {} public static synchronized CatalogTree getInstance() { if (instance == null) { instance = new CatalogTree(); instance.reloadCatalogs(); } return instance; } protected TreeNode transform(Object info) { Catalog catalog = (Catalog) info; TreeNode node = new TreeNode(); node.setNodeId(catalog.getCatalogId()); node.setParentId(catalog.getParentId()); node.setBindData(catalog); return node; } public void reloadCatalogs() { List nodes = CatalogDAO.getInstance().findAll(); super.reload(nodes); } public Catalog getCatalogNode(String catalogId) { TreeNode node = super.getTreeNode(catalogId); return node == null ? null : (Catalog) node.getBindData(); }}?
?
最后,我们只要使用以下的语句就可以了:
1. CatalogTree.getInstance().getTreeNode(...)
2. CatalogTree.getInstance().getCatalogNode(...)
3. CatalogTree.getInstance().getRootNode()
然后通过 TreeNode,就可以得到 parent, parents 和 children, allChildren?
?