网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.优化hibernate性能的几点建议.
.Java的网络功能与编程4.
.使用J2EE整合企业应用.
.EJB轻松进阶之二.
.Servlet和ThreadLocal的测试.
.Boolean 对象.
.使用Eclipse IDE创建统一开发环境.
.Generic Data Access Objects 设.
.Java从何而来?为什么会如此火?.
.阳光在线电子商务解决方案.
.小小日历(calendar).
.搭建Java桌面应用程序原型(二).
.java缓冲区溢出编程心得.
.Java 访问 Access 的一般方法介绍.
.Java中的static的含义.
.Spring框架快速入门之简介.
.Java面试陷阱第三波.
.JBuilder下调试java程序最简单的.
.学习J2ME编程需要掌握的七种技术.
.Java 库的建立方法及其实例(下).

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

发表日期:2008-1-5



  当前的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文档对象。
上一篇:Sun新添Java XML Pack套包 人气:619
下一篇:用XML和Servlet构建在线问答系统 人气:789
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐