我现在想根据一棵树,生产数据库总的一张表.表中只包含两个字段:节点,父节点.

解决方案 »

  1.   

    不用,加结点类型,不如加个字段childrenCount 子结点数目
    class Node
    {
    static final String T_tree="T_tree";      //存储树形结构的表名
    int id; //结点Id (唯一)
    int parentId;  //父结点Id
    String path; //结点路径    (唯一)
    int childrenCount=0; //子结点数目    叶节点为0
    int resId; //结点对应的资源Id。如果是非叶节点,则为0。

    static int getRootId()
    {
    String path="";
    DBProxy dbProxy=DBProxy.getInstance();
    try
    {
    String queryTopNodeSQL="select Id from "+T_tree+
    " where parentId='"+0+"'";
    ResultSet rst=dbProxy.query(queryTopNodeSQL);
    if (rst.next())
    {
    return rst.getInt("Id");
    }else
    {
    String insertTopNodeSQL="insert into "+T_tree+
    " (ParentId,Path) values('0','"+path+"')";
    dbProxy.update(insertTopNodeSQL);
    rst=dbProxy.query(queryTopNodeSQL);

    }
    return rst.getInt("Id");

    }catch(Exception e)
    {
    e.printStackTrace();
    return -1;
    }
    }

    Node(int id,int parentId,String path,int childrenCount,int resId)
    {
    this.id=id;
    this.parentId=parentId;
    this.path=path;
    this.childrenCount=childrenCount;
    this.resId=resId;
    }

    void pointToRes(int resId)
    {

    DBProxy dbProxy=DBProxy.getInstance();
    dbProxy.doSetSavepoint();
    try
    {
    Res res=Res.getRes(resId);
    if (res!=null)
    {
    String queryIdSQL="update "+T_tree+
    " set ResId="+resId+" where Id='"+id+"'";
    dbProxy.updateWithTrans(queryIdSQL);
    System.out.println(queryIdSQL);
    res.addHolder();

    }
    dbProxy.doCommit();
    }catch(Exception e)
    {
    dbProxy.doRollback();
    e.printStackTrace();
    return;
    }finally
    {
    dbProxy.release();
    }

    }

    static void creatTable()
    {
    String creatTableSQL="if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T_tree]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)"+
    "drop table [dbo].[T_tree]"+
    "CREATE TABLE [dbo].[T_tree] ("+
    " [Id] [int] IDENTITY (1, 1) NOT NULL ,"+
    " [ParentId] [int] NOT NULL ,"+
    " [Path] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,"+
    " [ChildrenCount] [int] NOT NULL ,"+
    " [ResId] [int] NOT NULL "+
    ") ON [PRIMARY]"+

    "ALTER TABLE [dbo].[T_tree] WITH NOCHECK ADD "+
    " CONSTRAINT [DF_T_tree_ChildrenCount] DEFAULT (0) FOR [ChildrenCount],"+
    " CONSTRAINT [DF_T_tree_ResId] DEFAULT (0) FOR [ResId],"+
    " CONSTRAINT [PK_T_tree] PRIMARY KEY  CLUSTERED "+
    " ("+
    " [Id]"+
    " )  ON [PRIMARY] ";
    DBProxy dbProxy=DBProxy.getInstance();
    try
    {
    dbProxy.update(creatTableSQL);
    }catch(Exception e)
    {
    e.printStackTrace();
    }finally
    {
    dbProxy.release();
    } }

    /*
     * 根据结点path,查找结点
     */
    public static Node getNode(int id)
    {

    int parentId=0;
    String path="";
    int childrenCount=0;
    int resId=0;

    DBProxy dbProxy=DBProxy.getInstance();
    try
    {
    String queryIdSQL="select * from "+T_tree+
    " where Id='"+id+"'";
    ResultSet rst=dbProxy.query(queryIdSQL);
    if (rst.next())
    {
    //id=rst.getInt("Id");
    parentId=rst.getInt("ParentId");
    path=rst.getString("Path");
    childrenCount=rst.getInt("ChildrenCount");
    resId=rst.getInt("ResId");
    return new Node(id,parentId,path,childrenCount,resId);
    }else
    {
    return null;
    }

    }catch(Exception e)
    {
    e.printStackTrace();
    return null;
    }finally
    {
    dbProxy.release();
    }
    }

    /*
     * 根据结点Id,查找结点
     */
    public static Node getNode(String path)
    {
    int id=0;
    int parentId=0;
    int childrenCount=0;
    int resId=0;

    DBProxy dbProxy=DBProxy.getInstance();
    try
    {
    String queryIdSQL="select * from "+T_tree+
    " where Path='"+path+"'";
    ResultSet rst=dbProxy.query(queryIdSQL);
    if (rst.next())
    {
    id=rst.getInt("Id");
    parentId=rst.getInt("ParentId");
    //path=rst.getString("Path");
    childrenCount=rst.getInt("ChildrenCount");
    resId=rst.getInt("ResId");
    return new Node(id,parentId,path,childrenCount,resId);
    }else
    {
    return null;
    }

    }catch(Exception e)
    {
    e.printStackTrace();
    return null;
    }finally
    {
    dbProxy.release();
    }
    }

    /*
     * 生成新的结点,并记入数据库
     */
    public static Node generateNode(Node parent,String directPath)
    {
    int id=0;
    int parentId=parent.id;
    String path=parent.path+directPath;
    int childrenCount=0;
    Node tempNode=Node.getNode(path);if (tempNode!=null)
    {
    if (tempNode.resId!=0)
    Res.getRes(tempNode.resId).removeHolder();
    return tempNode;
    }
    DBProxy dbProxy=DBProxy.getInstance();
    dbProxy.doSetSavepoint();
    try
    {
    String insertSQL="insert into "+T_tree+
    "(ParentId,Path,ChildrenCount,ResId)"+
    "values(?,?,?,?)";
    Object[] values={new Integer(parentId),
    path,
    new Integer(childrenCount),
    new Integer(0)};
    dbProxy.updateWithTrans(insertSQL,values);

    String updateParentChildrenCount="update "+T_tree+
    " set ChildrenCount=ChildrenCount+1" +
    " where Id="+parentId+"";
    System.out.println(updateParentChildrenCount);
    dbProxy.updateWithTrans(updateParentChildrenCount);
    dbProxy.doCommit();
    return Node.getNode(path);
    }catch(Exception e)
    {
    dbProxy.doRollback();
    e.printStackTrace();
    return null;
    }finally
    {
    dbProxy.release();
    }

    } public void remove()
    {
    DBProxy dbProxy=DBProxy.getInstance();
    dbProxy.doSetSavepoint();
    try
    {
    String removeNodeSQL="delete "+T_tree+
    "where Id='"+id+"'";
    dbProxy.updateWithTrans(removeNodeSQL);
    if (resId!=0) 
    Res.getRes(resId).removeHolder();
    }catch(Exception e)
    {
    dbProxy.doRollback();
    e.printStackTrace();
    return;
    }finally
    {
    dbProxy.release();
    }
    return;
    } public Node[] getChildren()
    {
    DBProxy dbProxy=DBProxy.getInstance();
    Node[] children=new Node[childrenCount];
    try
    {
    String getChildrenSQL="select * from "+T_tree+
    " where ParentId="+id;
    ResultSet rst=dbProxy.query(getChildrenSQL);
    int index=0;
    while(rst.next())
    {
    children[index]=new Node(
    rst.getInt("Id"),
    rst.getInt("ParentId"),
    rst.getString("Path"),
    rst.getInt("ChildrenCount"),
    rst.getInt("ResId"));
    index++;
    }
    return children;
    }catch(Exception e)
    {
    dbProxy.doRollback();
    e.printStackTrace();
    return null;
    }finally
    {
    dbProxy.release();
    }
    }

    public static Node creatTree(String path)
    {
    String[] paths=path.split(",");
    Node parent=Node.getNode(getRootId());
    String tempPath=parent.path;

    Node tempNode=null;
    for(int i=0;i<paths.length;i++)
    {
    if (paths[i].equals("")) 
    continue;
    if((tempNode=Node.getNode(tempPath))!=null)
    {
    parent=Node.generateNode(parent,","+paths[i]+",");
    }else
    {
    parent=tempNode;
    }
    tempPath+=","+paths[i]+",";
    }
    return parent;
    }
    }    这是一个完整的树 和 数据库中一个表的映射的类。
    这个类中,id是数据库中自动产生的一行的主键,path是一个子结点沿途的结点id。用,id,,id,,id,的结构表示,这也是唯一的。parentId是父结点Id,resourse是如果这个结点是叶节点,那么这个叶节点对应的资源。你可以直接去掉。childrenCount是子结点数目。为0表示没有子结点。如果你只是存储的话,只需要遍历树,然后不断用generateNode()写入数据库就可以了。其他函数除了creatTable()都不用
      

  2.   

    http://community.csdn.net/Expert/TopicView.asp?id=4236957
      

  3.   

    节点,父节点,tree_id,是否有子节点,是否允许有子节点,