setUrlString(thinOraclePrefix + host + ":" + port + ":" + sid);
setUserName(userName);
setPassword(password);
}
}
ODBCDataBaseHandler区别不大,只是它处理的是数据源名称(DSN),而非主机名称、端口和SID。之所以要使用与Oracle数据库有关的主机名称、端口号和SID,是因为我们处理的是一个数据库服务器,而不是一个数据库文件。但是,Microsoft Access关系数据库要使用.mdb文件:
public class ODBCDataBaseHandler extends AbstractDataBaseHandler{
private String urlString;
private String userName;
private String password;
private String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";
private String dsn;
private String odbcPrefix = "jdbc:odbc:";
public ODBCDataBaseHandler(String dsn, String userName, String password){
/* a valid url connection string format is: "jdbc:odbc:dsn" */
this.dsn = dsn;
setUrlString(odbcPrefix + dsn);
setUserName(userName);
setPassword(password);
setDriverName(driverName);
}
}
要了解访问一种特定数据库的细节,请查阅产品文档。你需要用另一个类来调用一个具体的DataBaseHandler,并进行XSL转换,从而将数据库结果转换成一种有用的替代输出类型。
SQLMapper
SQLMapper类用一个DataBaseHandler类来完成它的数据库工作,并用一个映射方法将文档对象转换成需要的输出类型。映射方法返回一个字符串,因为原来就假定输出由字符数据构成。另外,也可以使用一个StringBuffer。
SQLMapper需要一个SQL查询字符串、一个输出类型集以及一个用于执行具体工作的DataBaseHandler。它们用set方法来初始化,并用get方法来检索:
if ((getSQL() != null)
&& (getSQL().length() 〉 0)
&& (getOutputType() != null)
&& (isValidOutputType(getOutputType()))
&& (getDataBaseHandler() != null)){
Document document = dataBaseHandler.getDocument(getSQL());
TransformerFactorytransformerfactory = TransformerFactory.newInstance();
transformer = transformerfactory.newTransformer(getStylesheet());
同样只需要几行Java代码就可完成转换:
Transformer transformer = getTransformer();
StringWritersw = new StringWriter();
StreamResult result = new StreamResult(sw);
if (transformer != null) {
transformer.transform(new DOMSource(document.getDocumentElement()), result);
output = sw.toString();
System.err.println("output: " + output);
}else{
System.err.println("No Transformer");
}
Transformer对象需要一个DOMSource对象。为了获得这个对象,我们向Transformer的构造函数传递一个DOM文档的根元素。
最后要由实现者设计自己的XSL样式表。也可选用一些默认样式表,以便将原始数据转换成HTML或者XML。下面是一个泛化的XSL样式表,它能使用所谓的“标识转换”(identity transformation)技术,将生成的数据转换成一个XML文档,并确保输出内容相容于UTF-8标准,并具有良好的可读性。
〈 xml version="1.0" encoding="UTF-8" 〉
〈xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"〉
〈xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /〉
〈xsl:template match="@*|node()"〉
〈xsl:copy〉
〈xsl:apply-templates select="@*|node()"/〉
〈/xsl:copy〉
〈/xsl:template〉
〈/xsl:stylesheet〉
下面是一个泛化的XSL样式表,它能将生成的数据转换成一个HTML表格:
〈 xml version="1.0" encoding="UTF-8" 〉
〈xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Tr