從JDBC數據庫提取對XML/DOM友好的數據

字號:

從JDBC數據庫提取對XML/DOM友好的數據
    當前的Java版本提供了完備的工具,可將輸出內容從關系數據庫查詢轉換成XML。最終獲得的將是一個DOM(文檔對象模型)文檔對象。利用XSL(可擴展樣式語言),它進而能轉換成任意輸出格式。本文介紹如何構建一個接口,用它讀取與JDBC兼容的任何關系數據庫,創(chuàng)建一個結果集,以便轉換成任何類型的字符輸出。
    · 接口
    最開始必須定義一個接口。這個接口在實現后,應該能建立一個數據庫連接、向其傳遞一個SQL查詢、讀取結果以及創(chuàng)建一個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執(zhí)行set和get方法的泛化操作,而且一旦設置好所有數據庫處理參數,AbstractDataBaseHandler就要執(zhí)行與數據庫進行交互的泛化操作。惟一需要拿掉的就是與特定數據庫類型有關的那些細節(jié),以及為了獲得DataBaseHandler的一個具體實現而必須定義的設置細節(jié)。
    get和set方法負責設置私有類變量;通過擴展AbstractDataBaseHandler而創(chuàng)建數據庫處理器對象時,這些私有類變量將發(fā)生變化。這個過程是非常直觀易懂的,如清單A所示。
    getDocument()方法中的操作位于一個try catch塊中。數據庫事務處理過程中一旦發(fā)生任何錯誤,或者要求的任何輸入參數沒有設置,錯誤就會被捕捉。SQLException允許多個異常鏈接到一起,這為我們帶來了極大的方便。你必須遍歷SQLException,檢查數據庫交互過程中可能發(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();