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

字號(hào):

從JDBC數(shù)據(jù)庫提取對(duì)XML/DOM友好的數(shù)據(jù)
    當(dāng)前的Java版本提供了完備的工具,可將輸出內(nèi)容從關(guān)系數(shù)據(jù)庫查詢轉(zhuǎn)換成XML。最終獲得的將是一個(gè)DOM(文檔對(duì)象模型)文檔對(duì)象。利用XSL(可擴(kuò)展樣式語言),它進(jìn)而能轉(zhuǎn)換成任意輸出格式。本文介紹如何構(gòu)建一個(gè)接口,用它讀取與JDBC兼容的任何關(guān)系數(shù)據(jù)庫,創(chuàng)建一個(gè)結(jié)果集,以便轉(zhuǎn)換成任何類型的字符輸出。
    · 接口
    最開始必須定義一個(gè)接口。這個(gè)接口在實(shí)現(xiàn)后,應(yīng)該能建立一個(gè)數(shù)據(jù)庫連接、向其傳遞一個(gè)SQL查詢、讀取結(jié)果以及創(chuàng)建一個(gè)DOM文檔對(duì)象。下面的DataBaseHandler接口定義了與數(shù)據(jù)庫進(jìn)行交互的行為(注意,本例缺少import語句,所以不能編譯)。尤其要注意的是,getDocument()查詢所返回的文檔將由其他進(jìn)程轉(zhuǎn)換成所需的輸出類型,這種轉(zhuǎn)換是獨(dú)立于數(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ù)庫交互所需的最起碼的行為。它包括幾個(gè)get和set方法,用于確保數(shù)據(jù)庫驅(qū)動(dòng)程序名稱、用戶名和密碼都得到了設(shè)置,或者以后能夠檢索到。下面總結(jié)了DataBaseHandler的需求:
    urlString
    userName
    password
    sqlQuery string
    driverName
    調(diào)用set方法之后,getDocument()方法將完成所有實(shí)際的工作:
    Document getDocument(String sqlQuery);
    傳給set方法的所有輸入都可能已經(jīng)傳給getDocument()方法。從重用性的角度說,應(yīng)該對(duì)這兩個(gè)方法進(jìn)行分隔,使類的實(shí)現(xiàn)能方便和靈活地利用這種多重輸入傳遞功能。
    接口的一個(gè)抽象實(shí)現(xiàn)
    接著要定義一個(gè)抽象類,它負(fù)責(zé)實(shí)現(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的一個(gè)具體實(shí)現(xiàn)而必須定義的設(shè)置細(xì)節(jié)。
    get和set方法負(fù)責(zé)設(shè)置私有類變量;通過擴(kuò)展AbstractDataBaseHandler而創(chuàng)建數(shù)據(jù)庫處理器對(duì)象時(shí),這些私有類變量將發(fā)生變化。這個(gè)過程是非常直觀易懂的,如清單A所示。
    getDocument()方法中的操作位于一個(gè)try catch塊中。數(shù)據(jù)庫事務(wù)處理過程中一旦發(fā)生任何錯(cuò)誤,或者要求的任何輸入?yún)?shù)沒有設(shè)置,錯(cuò)誤就會(huì)被捕捉。SQLException允許多個(gè)異常鏈接到一起,這為我們帶來了極大的方便。你必須遍歷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();