将结果集转换为XML
如果我们已用JDBC ResultSet和XML 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();
}
客户端例程
为了测试我们的程序,我们需要一个客户端例程。我将创建一个简单的类CustomerDAO,DAO是J2EE数据访问模式的。可以用它来封装数据源,当一个CustomerDAO被构建,它就会连接到我们的Pointbase数据库。当CustomerDAO被销毁时它会断开对数据库的连接。它的公用API是getCustomerList()方法,下面是它的实现:
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。
下面是一个简单的测试方法用来测试CustomerDAO和JDBCUtil对象。
public static void main(String argv[]) throws Exception
{
CustomerDAO dao = new CustomerDAO();
Document doc = dao.getCustomerList();
System.out.println(JDBCUtil.serialize(doc));
}
我们简单的构建一个CustomerDAO,并且让它返回一个customer列表作为DOM,JDBCUtil.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>