XML 和 WebSphere Studio Application Developer - 第九部分:利用 XML更新數據庫表

引言

IBM WebSphere Studio Application Developer(以下簡稱爲Application Developer)是一個應用程序開發產品,它支持利用JSP、Servlet、HTML、XML、Web 服務、數據庫和 EJB等不同的技術來構建各種應用程序。特別地,ApplicationDeveloper 提供 XML 和關係數據之間的緊集成。Application Developer 支持所有 WebSphere Application Server 支持的數據庫,包括 DB2、Oracle、Sybase 和 Microsoft SQL Server。

這是本系列文章的第九部分,重點介紹Application Developer 提供的 XML 工具。第九部分研究 XML to SQL特徵,這種特徵使您能夠利用 XML文檔來更新關係數據庫表。利用該特徵,您可以根據 XML文檔的內容執行數據修改操作,比如更新、刪除和插入等。本文首先介紹XML to SQL 嚮導,它是一個可視化的工具,可以用於交互式地更新數據庫表。接着,樣本應用程序將展示主要API 的使用。

第三部分特別重要,因爲如果將這一部分的內容與本文結合起來,將可以很好地展示關係數據庫和XML 之間的循環數據訪問。

本文將由三個主要部分組成:

爲了學習該樣本,您需要安裝WebSphere Studio ApplicationDeveloper 5.0 或 5.1。

從 SQL查詢生成XML

  1. 我們首先使用在本系列的 第三部分用過的 VIDEOS 數據庫。遵循 第三部分中的步驟來設置數據庫並根據 EMPLOYEES 表創建 SQL 查詢,如圖 1 所示。

    圖 1 . 使用 SQL Builder 創建 SQL 查詢
    使用 SQL Builder 創建 SQL 查詢

  2. 一旦 SQL 查詢創建完畢,我們就將使用 XML From SQL 嚮導(圖 2)帶有其他構件(比如語法文件、缺省的 XSL 文件)的 XML 文件。在此之前,我們先在 VideoStoreProject 中創建一個文件夾來存儲所有的結果構件。在本文中,我們將此文件夾命名爲 Employees
  3. 打開向導,右鍵單擊 select_employees,如圖 1 所示,然後選擇 Generate new XML...。選擇 DTD作爲 Schema 定義,將輸出文件夾命名爲 /VideoStoreProject/Employees 如圖 2 所示。

    圖 2. XML from SQL query 嚮導

    XML from SQL query 嚮導

  4. 單擊 Finish從 SQL 查詢生成 XML 構件作。這將會在在輸出文件夾中生成 XML、DTD、XSL、和 HTML 文件。HTML 的結果如表 1 所示。

    表 1. 生成的 SQL 查詢結果 select_ employees.xml

    EMP_ID 名稱 JOB_TITLE HIRE_DATE 存儲
    10Allan BakerManager2000-01-011
    11Carol DanManager2000-01-012
    20Eric FrankSales Rep2000-01-021
    21Garry HansAsst Sales Rep2000-02-011
    22Ivan JamesSales Rep2000-02-012
    12Karen LawManager2000-06-053
    23Mike NicholsSales Rep2000-06-063

    在下一章節中,我們將修改結果 XML 文件的內容,然後通過更新數據庫表來反映 XML 內容的改變。

    生成的 SQL 查詢結果的部分 XML 代碼( select_employees.xml ):

    
    <?xml version="1.0" encoding="UTF-8"?>
    <SQLResult>
        ...
        <EMPLOYEES>
    
            <EMP_ID>21</EMP_ID>
            <NAME>Garry Hans</NAME>
            <JOB_TITLE>Asst Sales
          Rep</JOB_TITLE>
            <HIRE_DATE>2000-02-01</HIRE_DATE>
            <STORE>1</STORE>
        </EMPLOYEES>
        <EMPLOYEES>
            <EMP_ID>22</EMP_ID>
            <NAME>Ivan James</NAME>
            <JOB_TITLE>Sales Rep</JOB_TITLE>
            <HIRE_DATE>2000-02-01</HIRE_DATE>
            <STORE>2</STORE>
        </EMPLOYEES>
            ...
    </SQLResult>
    
                            

利用XML 更新數據庫表

XML提供了許多更新數據庫的方法。在這一部分中,我們將通過 XML To SQL嚮導來更新 EMPLOYEES 表。

  1. 首先, 我們將修改前一部分生成的 XML 文件。但是請注意,我們不能修改您聲明的主鍵列或任何其他的鍵列;在本例中, EMP_ID 是主鍵列。我們將會如下更新 employees.xml 中的兩行:Garry 提升爲 Sales Rep,而 Ivan 提升爲存儲 1 中的 Manager。我們將 select_employees.xml 複製到 employees.xml 並修改相關內容,如下面的粗體文本所示:

    修改 XML 內容來更新數據庫( employees.xml ):

    
    
     <?xml version="1.0" encoding="UTF-8"?>
    <SQLResult>
        <EMPLOYEES>
            <EMP_ID>21</EMP_ID>
            <NAME>Garry Hans</NAME>
            
                  
                  <JOB_TITLE>Sales Rep</JOB_TITLE>
            <HIRE_DATE>2000-02-01</HIRE_DATE>
            <STORE>1</STORE>
        </EMPLOYEES>
        <EMPLOYEES>
            <EMP_ID>22</EMP_ID>
            <NAME>Ivan James</NAME>        
                  
                  <JOB_TITLE>Manager</JOB_TITLE>
            <HIRE_DATE>2000-02-01</HIRE_DATE>
            
                  
                  <STORE>1</STORE>
        </EMPLOYEES>
    </SQLResult>
    
                                
                
                
  2. 文件修改完後,在文件上單擊右鍵,在 Navigator 視圖中調用 XML To SQL 嚮導。您可以選擇 File => New => Other... => XML 來啓動向導。圖 3 顯示了嚮導的第一個對話框,可以用來準備數據庫連接。我們可以創建一個新的連接或重用前面已經創建好的 Video連接。選擇 Use existing connection:,然後選擇 Next

    3. 數據庫連接頁
    Database connection page

  3. 在下一個對話框中(圖 4),從 Action 下拉列表中選擇 UPDATE,因爲我們將更新 EMPLOYEES 表。(在其他的 Schema 中可能會存在同名的表,所以務必保證選擇正確的 Schema。)

    4. Action(和可選的 Schema 選擇頁 Action (and optional Schema) selection page

  4. 在 XML to SQL 嚮導的最後一頁上,選擇 JOB_TITLESTORE,它們是需要更新的列。標有鑰匙圖標的鍵列字段是不可選的。單擊 Finish完成數據庫表的更新。

    圖 5.

Columns

 
Columns page

使用XMLToSQL API 的樣本應用程序

在這一部分中,我們將開發一個使用 XMLToSQL API 進行 VIDEOS數據庫更新的命令行應用程序。利用這個應用程序,您可以通過輸入XML 文件來更新 Employees 表的記錄、在 Employees表中插入新的記錄或刪除現有的記錄。輸入 XML文件的格式必須符合由SQL To XML嚮導生成 XML 文件的要求。此樣本程序僅僅演示 API可以如何用來執行數據庫操作。在 plugins_directory/com.ibm.etools.sqltoxml/jars/sqltoxml_javadoc.zip 上可以找到API的完整的Javadoc。

1. 準備 SQLProperties

該類用於提供XMLToSQL 更新數據庫表所必需的數據。該類的實例用作 XMLToSQL 構造器的一個參數。

首先,創建一個 SQLProperties實例,同時提供目標操作(包括數據庫用戶 ID、密碼,JDBC 連接信息以及SQL命令模式(比如更新、插入或刪除))所必需的信息。這些信息可以通過該類的set 方法來獲得,也可以外部 XST 文件(可以作爲 SQL to XML的一部分生成)來提供。

下面的樣本代碼提供了使用 SET 方法所需的信息。

使用SQLProperties:


import com.ibm.etools.xmltosql.*;
...
SQLProperties prop = new SQLProperties();

        
        prop.setLoginId("db2admin");
prop.setPassword("db2admin");
prop.setJdbcDriver("COM.ibm.db2.jdbc.app.DB2Driver");
prop.setJdbcServer("jdbc:db2:VIDEOS");
prop.setSchema("XMLTEST");
prop.setAction(SQLProperties.UPDATE);
                
      
      

注意上面的代碼片段,如果我們想提供我們自己的JDBC 連接信息,那麼粗體部分就是不需要的。這可以調用MLToSQL.setConnection(java.sql.Connection)方法來完成。

對於我們的樣本程序,我們將使用外部XST 文件來加載信息。文件內容如下所示:

update_employees.xst :


<?xml version="1.0"?>   
      <SQLGENERATEINFORMATION>   
        <DATABASEINFORMATION>   
          <LOGINID>db2admin</LOGINID>   
          <PASSWORD>db2admin</PASSWORD>   
          <JDBCDRIVER>COM.ibm.db2.jdbc.app.DB2Driver</JDBCDRIVER>
        
          <JDBCSERVER>jdbc:db2:VIDEOS</JDBCSERVER>
        
        </DATABASEINFORMATION>   
        <OPTIONS>   
          <SCHEMA>XMLTEST</SCHEMA>   
          <ACTION>UPDATE</ACTION>   
        </OPTIONS>   
      </SQLGENERATEINFORMATION>
                

下面的代碼顯示瞭如何將XST 文件加載到 SQLProperties。

代碼示例:loadProperties()



import com.ibm.etools.xmltosql.*;
...
private SQLProperties loadProperties(String propertiesFile) throws
Exception {
  SQLProperties prop = new SQLProperties();
  prop.load(propertiesFile);
  return prop;
}
                

2.創建 XMLToSQL 實例

一旦準備好SQLProperties,我們就需要去創建一個使用 XML 文檔進行記錄的添加、修改、刪除操作的XMLToSQL 實例。XML結構和數據庫表之間的映射關係是建立在一組映射規則上的。如下面的XML 片段所示:

XMLToSQL 映射規則


<RootElement>  
           <EMPLOYEE>  
             <FIRSTNAME>CHRISTINE</FIRSTNAME>
             <LASTNAME>HAAS</LASTNAME>
           </EMPLOYEE>  
           <EMPLOYEE>  
             <FIRSTNAME>MICHAEL</FIRSTNAME>
             <LASTNAME>THOMPSON</LASTNAME>
           </EMPLOYEE>
        ...
         </RootElement>
                

  • 根元素可以包含 0-n 個元素。根元素的標籤是不相關的。根目錄所包含的全部元素都按照特定的操作類型進行處理。
  • 每個元素都映射到相對應表中的一行上。例如,EMPLOYEE 元素映射到 EMPLOYEE 表。EMPLOYEE 的子元素根據名稱映射到 EMPLOYEE 表的兩列。也就是說,FIRSTNAME 元素對應 EMPLOYEE 表中的 FIRSTNAME 列,LASTNAME 元素對應 EMPLOYEE 表中的 LASTNAME 列。 
  • XMLToSQL 庫能根據表中所對應的列的列值和數據類型來創建適當的 SQL 語句(例如插入、更新或刪除)。 

首先採用SQLToXML 運行時庫來創建有效的XML文檔,然後再修改它來提供用於更新的值是個很好的方法。同時,您也可以在編寫使用XMLToSQL 運行時庫的代碼之前通過 XML To SQL 嚮導進行 XML文檔的單元測試。

我們在前面的部分中創建的 SQLProperties已傳遞到了 XMLToSQL 構造器中。XMLToSQL創建完後,就可以設置主鍵列和目標列了。下面的樣本代碼演示了這些步驟:

代碼示例-- execute()


import com.ibm.etools.xmltosql.*;
 import java.sql.*;

public class UpdateEmployees
 ...
 private void execute(String propertiesFile, String xmlFile, String
action, Connection connection) throws Exception {
   SQLProperties prop = loadProperties(propertiesFile);
   prop.setAction(action); // override action
if we want a different action than the one set in SQLProperties
   XMLToSQL xml2sql = new XMLToSQL(prop);
   xml2sql.addToKeyColumns("EMP_ID");
   xml2sql.addToUpdateColumns("JOB_TITLE");
   xml2sql.addToUpdateColumns("STORE");
   xml2sql.setTrace(true);
   if (connection != null)
     xml2sql.setConnection(connection);
   xml2sql.execute(xmlFile);
 }
 ...
 } // end UpdateEmployees
                

從上面的代碼中可以發現三件有趣的事情,它展示了在配置XMLToSQL 的過程中其他的一些靈活性:

  • prop.setAction() 用於覆蓋在 update_employees.xst 中指定的操作。例如,如果我們想刪除所對應的行而不是更新它們,我們就可以使用 prop.setAction(SQLProperties.DELETE)。
  • 如果我們想使用 XMLToSQL 來顯示 SQL 語句,當在命令行上執行操作時,xml2sql.setTrace(true) 就可以打印出 SQL 語句。同時我們還可以把 java.io.PrintWriter 作爲附加的參數來使用 setTrace()。詳細信息請參閱 Javadoc。
  • 注意 xml2sql.setConnection() 方法。如果沒有它,XMLToSQL 在執行一個操作前,將使用用戶提供的數據庫信息來創建 JDBC 連接,完成操作後,又會關閉連接。但是,setConnection() 能夠提供一外部連接,那麼在這種情況下,XMLToSQL 就會改爲使用此連接。該用戶將負責清理隨後操作中的連接。

3.執行程序


main() 方法從命令行中提取 XST 和 XML文件的名稱,同時設置諸如 UPDATE 等操作類型。由於 update_employees.xst 已經定義了 UPDATE操作,所以就沒有必要來覆蓋操作了,除非我們想介紹這種方法的使用。同樣地,一旦設置好變量,我們就可以通過調用update.execute()方法來執行操作。

代碼示例 -- main()


import com.ibm.etools.xmltosql.*;
import java.sql.*;
...
static public void main(String[] args) {
  String propertiesFile = args[0];
  String xmlFile = args[1];
  String action = SQLProperties.UPDATE;
  Connection connection = null;
  try {
    UpdateEmployees update = new UpdateEmployees();
    update.execute(propertiesFile,xmlFile,action,connection);
  } catch (Exception e) {
    System.out.println("Error updating Videos database:
" + e);
  }
}
                

本文中所描述的源代碼可以從 下載文件中獲得。解壓 下載文件,並將下列文件添加到工作目錄:

  • plugins_directory/com.ibm.etools.sqltoxml/jars/sqltoxml.jar
  • plugins_directory/com.ibm.etools.sqltoxml/jars/xmltosql.jar
  • plugins_directory/org..apache.xerces/xercesImpl.jar
  • plugins_directory/org..apache.xerces/xmlParserAPIs.jar
  • db2java.zip (DB2 JDBC driver) from your DB2 installation directory

下載文件還包含對您有用的這些文件:

  • build.bat : 編譯 UpdateEmployees.java
  • update.bat : 數據庫修改

要編譯 UpdateEmployees.java ,請鍵入如下命令:
> build

要執行該程序,請鍵入如下命令:
> update update_employees.xst employees.xml

結束語


本文說明了如何使用WebSphere Studio Application Developer 中的 XML To SQL 嚮導和運行時 API來完成 XML 和關係數據庫之間數據的來回轉移。API 廣泛用於支持JDBC驅動程序的各種數據庫產品。而且,可以通過諸如連接池機制等其他方式來創建JDBC 連接。

最近,主流的數據庫廠商開始在由數據庫查詢生成XML 領域採用 SQL/XML 標準。XQuery 的使用也開始出現。但是,由於這些標準當前都集中到了由查詢生成XML 上,所以在這些標準成熟之前,SQLToXML和 XMLToSQL API 的組合使用將是 XM L和關係數據庫之間進行數據轉移的合理途徑。

下載

NameSizeDownload method
xmltosql_sample_pgm.zip4 KBHTTP
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章