将JDBC结果集转成XML格式文件

将结果集转换为XML

如果我们已用JDBC ResultSetXML documents基本知识,我们就可以书写我们第一个例子,我们给我们这个类取名为JDBCUtil

public class JDBCUtil
{

我们首先创建一个方法将JDBC ResultSet转换为DOM,下面是方法声名:

public static Document toDocument(ResultSet rs)
   throws ParserConfigurationException, SQLException
{

一个JDBC结果集作为唯一的参数传入,并返回一个XML DOM 或者Document

首先我们利用JAXP API来创建一个Document 对象:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder        = factory.newDocumentBuilder();
Document doc                   = builder.newDocument();

Next, the Results element of the document is created.

下一步,创建Document中的element对象。Element中数据与结果集中一行对应。

Element results = doc.createElement("Results");
doc.appendChild(results);

我们取原数据从集果集中,以便获得在一行中有多少列和列名都是什么:

ResultSetMetaData rsmd = rs.getMetaData();
int colCount           = rsmd.getColumnCount();

现在,我们遍例结果集,进入循环:

while (rs.next())
{
   Element row = doc.createElement("Row");
   results.appendChild(row);

创建一行,并把这插入父结点中。

下一步,我们遍历一行中的所有列,我们可以从原数据中获得一共有多少列,ResultSetMetaData.getColumnName()告诉我们每列的名字都是什么,用ResultSet.getObject()方法获得列所对应该的值。下面代码创建了一个叶子结点,代表了结果集中的一行。

for (int i = 1; i <= colCount; i++)
{
   String columnName = rsmd.getColumnName(i);
   Object value      = rs.getObject(i);
 
   Element node      = doc.createElement(columnName);
   node.appendChild(doc.createTextNode(value.toString()));
   row.appendChild(node);
}

现在,我们可以创将创建的XML document返回:

return doc;
}

下面是完整的源代码:

public static Document toDocument(ResultSet rs)
   throws ParserConfigurationException, SQLException
{
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder        = factory.newDocumentBuilder();
   Document doc                   = builder.newDocument();
 
   Element results = doc.createElement("Results");
   doc.appendChild(results);
 
   ResultSetMetaData rsmd = rs.getMetaData();
   int colCount           = rsmd.getColumnCount();
 
   while (rs.next())
   {
      Element row = doc.createElement("Row");
      results.appendChild(row);
 
      for (int i = 1; i <= colCount; i++)
      {
         String columnName = rsmd.getColumnName(i);
         Object value      = rs.getObject(i);
 
         Element node      = doc.createElement(columnName);
         node.appendChild(doc.createTextNode(value==null ? "" :value.toString()));
         row.appendChild(node);
      }
   }
   return doc;
}
/**
  * 序列化DOM为一个字符串
  * 
  */
 public static String ConvertXMLToString(Document doc){
  OutputFormat of = new OutputFormat(doc);
  of.setIndenting(true);
  StringWriter sw = new StringWriter();
  XMLSerializer serializer = new XMLSerializer(sw, of);
  try {
   serializer.serialize(doc);
  } catch (IOException e) {
   e.printStackTrace();
  }
  return sw.toString();
 }

客户端例程

为了测试我们的程序,我们需要一个客户端例程。我将创建一个简单的类CustomerDAODAOJ2EE数据访问模式的。可以用它来封装数据源,当一个CustomerDAO被构建,它就会连接到我们的Pointbase数据库。当CustomerDAO被销毁时它会断开对数据库的连接。它的公用APIgetCustomerList()方法,下面是它的实现:

public Document getCustomerList()
{
   Document doc = null;
 
   try
   {
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * from customer_tbl");
 
      doc = JDBCUtil.toDocument(rs);
 
      rs.close();
      stmt.close();
   }
   catch (Exception e)
   {
      e.printStackTrace();
   }
 
   return doc;
}

这个方法执行了一个简单的查询获得customer表中的所有数据。返回的结果集将利用JDBCUtil.toDocument()转换为XML

下面是一个简单的测试方法用来测试CustomerDAOJDBCUtil对象。

public static void main(String argv[]) throws Exception
{
   CustomerDAO dao = new CustomerDAO();
 
   Document doc    = dao.getCustomerList();
   System.out.println(JDBCUtil.serialize(doc));
 
}

我们简单的构建一个CustomerDAO,并且让它返回一个customer列表作为DOMJDBCUtil.serialize()utility类中的另一个方法,用来序列化DOM作为一个字符串。

下面是我们测试的输出:

<?xml version="1.0" encoding="UTF-8">
<Results>
   <Row>
      <CUSTOMER_NUM>1</CUSTOMER_NUM>
      <DISCOUNT_CODE>N</DISCOUNT_CODE>
      <ZIP>33015</ZIP>
      <NAME>SuperCom</NAME>
      <ADDR_LN1>490 Rivera Drive</ADDR_LN1>
      <ADDR_LN2>Suite 678</ADDR_LN2>
      <CITY>Miami</CITY>
      <STATE>FL</STATE>
      <PHONE>305-777-4632</PHONE>
      <FAX>305-777-4635</FAX>
      <EMAIL>supercom@aol.com</EMAIL>
      <CREDIT_LIMIT>100000</CREDIT_LIMIT>
      <LAST_SALE_DATE>1998-01-02</LAST_SALE_DATE>
      <LAST_SALE_TIME>08:00:00</LAST_SALE_TIME>
   </Row>
   <Row>
      <CUSTOMER_NUM>2</CUSTOMER_NUM>
      <DISCOUNT_CODE>M</DISCOUNT_CODE>
      <ZIP>33055</ZIP>
      <NAME>Livingston Enterprises</NAME>
      <ADDR_LN1>9754 Main Street</ADDR_LN1>
      <ADDR_LN2>P.O. Box 567</ADDR_LN2>
      <CITY>Miami</CITY>
      <STATE>FL</STATE>
      <PHONE>305-456-8888</PHONE>
      <FAX>305-456-8889</FAX>
      <EMAIL>www.tsoftt.com</EMAIL>
      <CREDIT_LIMIT>50000</CREDIT_LIMIT>
      <LAST_SALE_DATE>1998-01-02</LAST_SALE_DATE>
      <LAST_SALE_TIME>09:00:00</LAST_SALE_TIME>
   </Row>
   ...
</Results>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值