根据数据库中取记录自定义一棵树结构

原创 2001年11月01日 15:55:00


在servlet/jsp开发中,我们可能也会涉及到树结构的定义问题,比如从数据库中取出记录并定义一个XML树用于论坛结构的显示等。
因为是servlet,使用JAVA SWING中提供的JTree并不现实。

其实一棵实现基本功能的树并不复杂,所以我们自已动手。

首先,在数据库的结构一般是这样的几个字段不能少:

int id   节点id
int pid  父节点id
String title 显示字串
......

(其实前两个节点维持着树的结构是最重要的,后面你想怎么加都行了......)

然后我们来定义一个树节点类,代码如下:

/**
* 自定义的树结点
* @author:sharetop(sharetop@hotmail.com)
*/
import java.util.*;

class CTreeNode
{
  int id;       /*点ID号,对应数据库相应字段*/
 String title=null; 
 String href=null;
 
 CTreeNode parent=null; /*父节点对象*/
 Vector allChild;    /*保存了全部子节点*/
 
 /**
 *构造
 */
 CTreeNode()
 {
  allChild=new Vector();
 }
 
 /**
 *加子节点
 */
 void addChild(CTreeNode child)
 {
  allChild.add(child);
 }

 /**
 * 根据ID递归查找子节点,返回节点对象
 */
 CTreeNode findChild(int id)
 {
  if( id==this.id ) return this;
  for( Enumeration e = allChild.elements();e.hasMoreElements();)
  {
   CTreeNode temp = (CTreeNode)e.nextElement();
   if( temp.id==id ) return temp;
   CTreeNode tmp = temp.findChild(id);
   if( tmp!=null )return tmp;
  }
  return null;
 }
 
 /**
 * 生成一个XML字串
 */
 String create()
 {
  StringBuffer result= new StringBuffer();
  result.append("<node title=/"");
  result.append(title);
  result.append("/" href=/"");
  result.append(href);
  result.append("/" >");
  if( allChild.size()!=0 ){
    for( Enumeration e = allChild.elements();e.hasMoreElements();) {
     CTreeNode temp = (CTreeNode)e.nextElement();
     result.append(temp.create());
    }
  }
  result.append("</node>");
  return result.toString();
 }
 
}

 

 

好了,然后就是我们在servlet中如何使用这个类了:

在我们的TestServlet.java中加一个方法:

private String getXMLResult()
{
 StringBuffer result = new StringBuffer();
 
 /*这里是树根*/
 CTreeNode root = new CTreeNode();
 root.id=0;
 root.title="根目录";
 root.href="";
 
 try{
  Connection con = dbpool.getConnection();
  PreparedStatement ps = con.prepareStatement("select * from block order by id");
  ResultSet rs = ps.executeQuery();
  
  while( rs.next() ){
   /*每一条记录对应一个节点,关键是找到它在树上所处的位置*/
   CTreeNode node = new CTreeNode();
   node.id=rs.getInt("id");
   node.title=rs.getString("title");
   node.parent=root.findChild(rs.getInt("pid"));
   node.href=node.title+".html";
   node.parent.addChild(node);
  }    
  rs.close();
  ps.close();
  con.close();
  dbpool.freeConnection(con);
 }
 catch( Exception ex )
 {
  System.err.println("Error in Update - SQLBean : /r/n");
  ex.printStackTrace(System.err);
  return "";
 }
 return root.create();
 }

就是这么简单,TestServlet的doGet方法我也给在下面吧

  public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException
  {
 resp.setContentType("text/xml;charset=gb2312");
 PrintWriter out = resp.getWriter(); 
         
  out.println("<?xml version=/"1.0/" encoding=/"gb2312/" ?>");
 
 out.println(getResult());  
   
  out.flush();
  out.close();
 }

有兴趣可以测试一下。

这只是一个基本的树结构,如果要让它符合你的要求,你需要对它进行扩充,欢迎与我讨论 sharetop@hotmail.com

 

mysql优化之数据库随机取一条数据

大家都知道mysql 查询数据库随机取一条数据当然用rand()方法  其实这个方法是超级鸡肋的,当然你爱好也无所谓,首先列举两个表 a表   id(主键 int),cardnumber(身份证号...
  • u010757785
  • u010757785
  • 2017年10月13日 10:47
  • 277

从mysql数据表中随机取出一条记录

效率极差的一种办法: select * from 表名 order by rand( ) limit 1;  //此处的1就是取出数据的条数 高效写法 SELECT * FROM u...
  • buyueliuying
  • buyueliuying
  • 2017年09月23日 16:22
  • 438

oracle 在一张日志表中,同一个ID 有多条记录,每个ID只获取最新时间的记录

select c.object_id, c.total_time,c.total_count   from (select t.*,  row_number() over(partition by t...
  • LinBilin_
  • LinBilin_
  • 2015年12月14日 08:56
  • 2841

java 实现简单树结构

public class MyBtree { private Node root; class Node{ private int data; pri...
  • yaomu219
  • yaomu219
  • 2017年10月05日 10:23
  • 243

php MySQL使用rand函数随机取记录

php MySQL使用rand函数随机取记录如何在mysql中使用随机数, 如何写一个语句能一下更新几百条MYSQL数据!需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一...
  • siren0203
  • siren0203
  • 2011年03月14日 10:06
  • 2947

从数据库中获取今天的记录,最近一周的记录

条件where  to_days(addtime) = to_days(now()); 这里要了解to_days()函数的意思。定一个日期,返回一个天数(年为0以来的天数)。 where DATE...
  • u013077250
  • u013077250
  • 2016年12月09日 16:23
  • 555

SQLSERVER数据库中随机取记录

从A表随机取10条记录,用SELECT TOP 10 * FROM ywle order by newid() order by 一般是根据某一字段排序,newid()的返回值 是uniqueid...
  • tangbow
  • tangbow
  • 2012年07月25日 14:39
  • 10960

Android数据库中查找一条数据 query方法详解

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String gro...
  • chaozhung
  • chaozhung
  • 2013年06月05日 09:47
  • 10054

史上最强的JS:要求根据字符串生成树结构

目的:由字符串生成树结构,树结构包含在一个div内,该div能独立放置。禁止treeview控件,禁止ActiveX,XP上自带的IE6顺利浏览就可以了。 字符串命名规则: 1.符号“&”为节点分隔...
  • phphot
  • phphot
  • 2008年02月22日 10:44
  • 2015

SQL分组查询,结果只取最新一条记录

select a.* from (select * from TABLE order by create_time desc) a group by a.user_id这里查询的是USER_ID相同的...
  • ydk888888
  • ydk888888
  • 2017年08月10日 10:26
  • 2997
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据数据库中取记录自定义一棵树结构
举报原因:
原因补充:

(最多只允许输入30个字)