不用,加结点类型,不如加个字段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);
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()都不用