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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章