首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

数据库中的树形构造 - JAVA 设计 (通用)

2012-12-24 
数据库中的树形结构 - JAVA 设计 (通用)我们通常会在应用中碰到树形结构的内容,比如 文件夹/文件模型, 部

数据库中的树形结构 - 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

?

?

热点排行