分享
 
 
 

从JDBC数据库提取对XML/DOM友好的数据

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

当前的Java版本提供了完备的工具,可将输出内容从关系数据库查询转换成XML。最终获得的将是一个DOM(文档对象模型)文档对象。利用XSL(可扩展样式语言),它进而能转换成任意输出格式。本文介绍如何构建一个接口,用它读取与JDBC兼容的任何关系数据库,创建一个结果集,以便转换成任何类型的字符输出。

接口

最开始必须定义一个接口。这个接口在实现后,应该能建立一个数据库连接、向其传递一个SQL查询、读取结果以及创建一个DOM文档对象。下面的DataBaseHandler接口定义了与数据库进行交互的行为(注意,本例缺少import语句,所以不能编译)。尤其要注意的是,getDocument()查询所返回的文档将由其他进程转换成所需的输出类型,这种转换是独立于数据库的。

public interface DataBaseHandler{

Document getDocument(String sqlQuery);

String getUrlString();

void setUrlString(String urlString);

String getUserName();

void setUserName(String userName);

String getPassword();

void setPassword(String password);

String getDriverName();

void setDriverName(String driverName);

}

这是与数据库交互所需的最起码的行为。它包括几个get和set方法,用于确保数据库驱动程序名称、用户名和密码都得到了设置,或者以后能够检索到。下面总结了DataBaseHandler的需求:

urlString

userName

password

sqlQuery string

driverName

调用set方法之后,getDocument()方法将完成所有实际的工作:

Document getDocument(String sqlQuery);

传给set方法的所有输入都可能已经传给getDocument()方法。从重用性的角度说,应该对这两个方法进行分隔,使类的实现能方便和灵活地利用这种多重输入传递功能。

接口的一个抽象实现

接着要定义一个抽象类,它负责实现要求的大多数行为和操作,但某种特定数据库类型需要的那些行为必须排除在外。AbstractDataBaseHandler执行set和get方法的泛化操作,而且一旦设置好所有数据库处理参数,AbstractDataBaseHandler就要执行与数据库进行交互的泛化操作。惟一需要拿掉的就是与特定数据库类型有关的那些细节,以及为了获得DataBaseHandler的一个具体实现而必须定义的设置细节。

get和set方法负责设置私有类变量;通过扩展AbstractDataBaseHandler而创建数据库处理器对象时,这些私有类变量将发生变化。这个过程是非常直观易懂的,如清单A所示。

getDocument()方法中的操作位于一个try catch块中。数据库事务处理过程中一旦发生任何错误,或者要求的任何输入参数没有设置,错误就会被捕捉。SQLException允许多个异常链接到一起,这为我们带来了极大的方便。你必须遍历SQLException,检查数据库交互过程中可能发生的所有问题。

} catch (SQLExceptionsqle) {

while(sqle != null) {

System.err.println ("**** SQLException ****\n");

System.err.println ("** SQLState: " + sqle.getSQLState() + "\n");

System.err.println ("** Message: " + sqle.getMessage() + "\n");

System.err.println ("** Error Code: " + sqle.getErrorCode() + "\n");

System.err.println ("***********\n");

/* There could be multiple exception messages chained together. */

sqle= sqle.getNextException();

和其他任何异常一样,你可以为异常处理实现一个Java日志,用它记录发生的任何问题。必须确保可能发生的所有异常都包含在try catchā?????块中,以便分门别类地采取操作,让用户知道执行期间发生了什么问题。下面总结了SQLException包含的信息:

描述错误一个字符串

一个SQLstate字符串 string

一个整型错误代码,它是不同的厂商特有的

到下一个异常的链接

getDocument()方法首先检查要求的所有参数是否齐备,否则引发一个异常:

if(getUrlString() == null){

throw new Exception("Database URL String is not set.");

}

if(getUserName() == null){

throw new Exception("Database User Name is not set.");

}

if (getPassword() == null){

throw new Exception("Database Password is not set.");

}

if (getDriverName() == null){

throw new Exception("Database Driver Name is not set.");

}

一个SQL查询字符串作为输入来传递。它可为你需要的任何SQL字符串,比如:

SELECT * from mytable;

SELECT overdue, name, duedate, description from myactiontable;

接着创建JDBC驱动程序的一个实例,它向DriverManager注册驱动程序:

Class.forName(getDriverName());

DriverManager现在可使用注册的驱动程序来创建一个数据库连接,并接管所有数据库操作。

不同的数据库要使用不同的URL连接字符串。对于Oracle数据库,字符串的形式是:

host:port:sid

具体需要的值是在tsnames配置文件中定义的,该文件的名称是tnsnames.ora,其中的设置项如下所示:

mydb =

(DESCRIPTION =

(ADDRESS =

(PROTOCOL = TCP)

(Host = SERVERX.www.mycompany.com)

(Port = 1521)

)

(CONNECT_DATA =

(SID = examplesid)

(GLOBAL_NAME = exampledb)

)

)

然后根据前面设置的URL字符串、用户名和密码来创建一个Connection对象,再用Connection对象来创建一个Statement对象,并针对数据库执行查询,以便返回一个结果集对象。所有细节由JDBC无缝地处理。

取决于具体的SQL语句,语句执行之后也许不会返回任何值。这个类验证是否缺少返回值,只有在至少返回了一个数据行的前提下,才在文档中添加Element节点。列名要从一个ResultSetMetaData对象中检索,该对象是通过结果集的一个get方法来获得的:

ResultSetMetaDatarsmd = resultSet.getMetaData();

在一个while循环中,将使用结果集的游标或行号来遍历整个结果集,同时生成一个DOM文档对象。

while(resultSet.next()){

// add Element and TextNode objects which define each row and each data column.

}

处理了ResultSet及其元数据后,就结束了与数据库的交互。之后,就可用XML/DOM对象来容纳数据,并用XSL来格式化数据。

小结

本文讲述了如何创建一个接口,以便为DataBaseHandler定义泛化行为,以及如何用一个抽象类来实现它,以便将抽象类扩展成一个具体的、自定义的数据库处理程序。这种行为允许你透明地连接一个关系数据库,执行SQL查询,并返回一个结果集,随后可以将它的数据转换成一个DOM文档对象。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有