国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

從JDBC數(shù)據(jù)庫提取對XML/DOM友好的數(shù)據(jù)

2019-11-18 12:49:12
字體:
供稿:網(wǎng)友

  當(dāng)前的java版本提供了完備的工具,可將輸出內(nèi)容從關(guān)系數(shù)據(jù)庫查詢轉(zhuǎn)換成xml。最終獲得的將是一個DOM(文檔對象模型)文檔對象。利用XSL(可擴展樣式語言),它進(jìn)而能轉(zhuǎn)換成任意輸出格式。本文介紹如何構(gòu)建一個接口,用它讀取與JDBC兼容的任何關(guān)系數(shù)據(jù)庫,創(chuàng)建一個結(jié)果集,以便轉(zhuǎn)換成任何類型的字符輸出。
  
  接口
  最開始必須定義一個接口。這個接口在實現(xiàn)后,應(yīng)該能建立一個數(shù)據(jù)庫連接、向其傳遞一個SQL查詢、讀取結(jié)果以及創(chuàng)建一個DOM文檔對象。下面的DataBaseHandler接口定義了與數(shù)據(jù)庫進(jìn)行交互的行為(注重,本例缺少import語句,所以不能編譯)。尤其要注重的是,getDocument()查詢所返回的文檔將由其他進(jìn)程轉(zhuǎn)換成所需的輸出類型,這種轉(zhuǎn)換是獨立于數(shù)據(jù)庫的。
  
  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);
  }
  
  這是與數(shù)據(jù)庫交互所需的最起碼的行為。它包括幾個get和set方法,用于確保數(shù)據(jù)庫驅(qū)動程序名稱、用戶名和密碼都得到了設(shè)置,或者以后能夠檢索到。下面總結(jié)了DataBaseHandler的需求:
  
  urlString
  userName
  password
  sqlQuery string
  driverName
  調(diào)用set方法之后,getDocument()方法將完成所有實際的工作:
  
  Document getDocument(String sqlQuery);
  
  傳給set方法的所有輸入都可能已經(jīng)傳給getDocument()方法。從重用性的角度說,應(yīng)該對這兩個方法進(jìn)行分隔,使類的實現(xiàn)能方便和靈活地利用這種多重輸入傳遞功能。
  
  接口的一個抽象實現(xiàn)
  接著要定義一個抽象類,它負(fù)責(zé)實現(xiàn)要求的大多數(shù)行為和操作,但某種特定數(shù)據(jù)庫類型需要的那些行為必須排除在外。AbstractDataBaseHandler執(zhí)行set和get方法的泛化操作,而且一旦設(shè)置好所有數(shù)據(jù)庫處理參數(shù),AbstractDataBaseHandler就要執(zhí)行與數(shù)據(jù)庫進(jìn)行交互的泛化操作。惟一需要拿掉的就是與特定數(shù)據(jù)庫類型有關(guān)的那些細(xì)節(jié),以及為了獲得DataBaseHandler的一個具體實現(xiàn)而必須定義的設(shè)置細(xì)節(jié)。
  
  get和set方法負(fù)責(zé)設(shè)置私有類變量;通過擴展AbstractDataBaseHandler而創(chuàng)建數(shù)據(jù)庫處理器對象時,這些私有類變量將發(fā)生變化。這個過程是非常直觀易懂的,如清單A所示。
  
  getDocument()方法中的操作位于一個try catch塊中。數(shù)據(jù)庫事務(wù)處理過程中一旦發(fā)生任何錯誤,或者要求的任何輸入?yún)?shù)沒有設(shè)置,錯誤就會被捕捉。SQLException答應(yīng)多個異常鏈接到一起,這為我們帶來了極大的方便。你必須遍歷SQLException,檢查數(shù)據(jù)庫交互過程中可能發(fā)生的所有問題。
  
  } 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();
  
  和其他任何異常一樣,你可以為異常處理實現(xiàn)一個Java日志,用它記錄發(fā)生的任何問題。必須確保可能發(fā)生的所有異常都包含在try catchā?????塊中,以便分門別類地采取操作,讓用戶知道執(zhí)行期間發(fā)生了什么問題。下面總結(jié)了SQLException包含的信息:
  
  描述錯誤一個字符串
  一個SQLstate字符串 string
  一個整型錯誤代碼,它是不同的廠商特有的
  到下一個異常的鏈接
  getDocument()方法首先檢查要求的所有參數(shù)是否齊備,否則引發(fā)一個異常:
  
  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;
  
  接著創(chuàng)建JDBC驅(qū)動程序的一個實例,它向DriverManager注冊驅(qū)動程序:
  
  Class.forName(getDriverName());
  
  DriverManager現(xiàn)在可使用注冊的驅(qū)動程序來創(chuàng)建一個數(shù)據(jù)庫連接,并接管所有數(shù)據(jù)庫操作。
  
  
  不同的數(shù)據(jù)庫要使用不同的URL連接字符串。對于Oracle數(shù)據(jù)庫,字符串的形式是:
  
  host:port:sid
  
  具體需要的值是在tsnames配置文件中定義的,該文件的名稱是tnsnames.ora,其中的設(shè)置項如下所示:
  
  mydb =
  (DESCRIPTION =
  (ADDRESS =
  (PROTOCOL = TCP)
  (Host = SERVERX.www.mycompany.com)
  (Port = 1521)
  )
  (CONNECT_DATA =
  (SID = examplesid)
  (GLOBAL_NAME = exampledb)
  )
  )
  
  然后根據(jù)前面設(shè)置的URL字符串、用戶名和密碼來創(chuàng)建一個Connection對象,再用Connection對象來創(chuàng)建一個Statement對象,并針對數(shù)據(jù)庫執(zhí)行查詢,以便返回一個結(jié)果集對象。所有細(xì)節(jié)由JDBC無縫地處理。
  
  取決于具體的SQL語句,語句執(zhí)行之后也許不會返回任何值。這個類驗證是否缺少返回值,只有在至少返回了一個數(shù)據(jù)行的前提下,才在文檔中添加Element節(jié)點。列名要從一個ResultSetMetaData對象中檢索,該對象是通過結(jié)果集的一個get方法來獲得的:
  ResultSetMetaDatarsmd = resultSet.getMetaData();
  
  在一個while循環(huán)中,將使用結(jié)果集的游標(biāo)或行號來遍歷整個結(jié)果集,同時生成一個DOM文檔對象。
  
  while(resultSet.next()){
  // add Element and TextNode objects which define each row and each data column.
  }
  
  處理了ResultSet及其元數(shù)據(jù)后,就結(jié)束了與數(shù)據(jù)庫的交互。之后,就可用XML/DOM對象來容納數(shù)據(jù),并用XSL來格式化數(shù)據(jù)。
  
  小結(jié)
  本文講述了如何創(chuàng)建一個接口,以便為DataBaseHandler定義泛化行為,以及如何用一個抽象類來實現(xiàn)它,以便將抽象類擴展成一個具體的、自定義的數(shù)據(jù)庫處理程序。這種行為答應(yīng)你透明地連接一個關(guān)系數(shù)據(jù)庫,執(zhí)行SQL查詢,并返回一個結(jié)果集,隨后可以將它的數(shù)據(jù)轉(zhuǎn)換成一個DOM文檔對象。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 苏尼特右旗| 丹棱县| 徐闻县| 长泰县| 孝昌县| 关岭| 广安市| 新巴尔虎左旗| 孟连| 郴州市| 济宁市| 历史| 林西县| 兴和县| 大化| 堆龙德庆县| 巫山县| 贵州省| 南乐县| 湖北省| 尼勒克县| 瑞丽市| 松潘县| 海南省| 会泽县| 惠州市| 深泽县| 山东| 昭平县| 长汀县| 手游| 邯郸市| 陕西省| 卢氏县| 增城市| 大宁县| 澄城县| 武夷山市| 阳新县| 合水县| 克东县|