1. 程式人生 > 實用技巧 >關於Java的Oracle9中XML SQL Utility技術指導

關於Java的Oracle9中XML SQL Utility技術指導

■開發前要求配置
■SelectXML格式資料
■InsertXML格式資料
■UpdataXML格式資料
■DeleteXML格式資料

開發前要求配置
必須安裝Oracle客戶端
把Classpath指向
classes111.zip
xmlparserv2.jar
xsu111.jar
xsu12.jar

SelectXML格式資料
由於兩者之間具有相近的層次結構資料關係,關係資料庫模式能XML來模擬。假設一個書目列表的資料庫,BookList表設有下述列:BookID、Title、Author、Publisher、Year、ISBN和描述。下面是應用程式對資料庫進行的典型查詢:
SELECTTitle,Author,Publisher,Year,ISBNFROMBOOKLISTWHEREBOOKID=1234;

若通過OraleXMLSQLUtility提交查詢,資料庫將返回下述結果:

 1 <?xml version=’’1.0’’?>
 2 <ROWSET>
 3   <ROW id=”1”>
 4 <TITLE>The Difference Between God and Larry Ellison:Inside Oracle
 5     Corporation</TITLE>
 6 <AUTHOR>Mike Wilson<AUTHOR>
 7
<PUBLTSHER>William Morrow and Co.</PUBLISHER> 8 <YEAR>1997</YEAR> 9 <ISBN>0688149251</ISBN> 10 </ROWSET>

如果應用程式只想簡單地把輸出寫入到檔案,可以用字串形式輸出。如

果直接送給OracleXML解析器用XSLT處理器進行變換,可以用DOM物件形式輸出。提供DOM輸出可以無需解析操作,否則在應用XSL轉換之前需要實施解析操作。
如下列程式碼段所示,通過把查詢傳遞給oranle.xml.sql.query.OracleXMLQuery類進行查詢提交:

 1 import java . sql . * ;
 2 import java . math . * ;
 3 import Oracle . xml . sql .query . * ;
 4 import oracle . jdbc .* ;
 5 import oracle . jdbc . driver . * ;
 6 public static void main (String args[ ])throws SQLException
 7 {
 8   string tabName = “Booklist” ;
 9   string user = “scott/tiger” ;
10   DriverManager . registerDriver(new oracle . jdbc .driver .oracleDriver( )) ;
11   Connection conn=
12 DriverManager . getConnection( “jdbc:oracle:oci8”+user+”@”) ;
13   OracleXMLQuery qry = new OracleXMLQuery(conn, “select * from+tabName”);
14   String xmlstring = qry . getXMLString( ) ;
15   System . out .println (“OUTPUT IS :\n “+xmlstring”);
16   Conn . close ( ) ;

OracleXMLSQLUtility也提供可選的命令列介面,它用於產生與特殊資料庫模式相關的DTD。假定所有的內容都已正確安裝,只需要執行如下命令就可得到完整的命令列選列表:

Javaoraclexml
下面的命令列用於怎樣建立與正在查詢的特殊資料庫模式相關的DTD:

1 java oraclexml getxml ?scott/tiger “scott/tiger”-withDTD “SELECT” *
2  
3  FROM BookList”

對於前面所說的BOOKLIST表,在該查詢產生的XML文件中OracleXMLSQLUtility會輸出如下的DTD:

1 〈!ELEMENT BOOKLIST (BOOKID, Title, Author, Publisher, Year, ISBN, Description)〉
2 <!ELEMENT BOOKID (#PCDATA)>
3 <!ELEMENT Author (#PCDATA)>
4 <!ELEMENT Publisher (#PCDATA)>
5 <!ELEMENT Year (#PCDATA)>
6 <ELEMENT ISBN (#PPCDATA)>
7 <!ELEMENT Description (#PCDATA)>

InsertXML格式資料
一旦在資料庫中建立了模式,只要XML格式的資料與從模式中產生的DTD相符,XMLSQLUtility就會把資料儲存到模式中去。XMLSQLUtility提供把XML文件對映為錶行的能力。該儲存使用簡單對映將元素標記名對映為列,通過預設對映,將XML字串轉換為合適的資料型別。當XML元素還有子元素時,則該XML元素被對映為SQL物件型別。
為了儲存XML格式的資料,XMLSQLUtility啟動一個插入語句,在插入語句的VALUES子句中繫結所有元素值。每個行元素的內容被對映為一個單獨值集合。
返回到本章前面的Booklist範例,下面是儲存XML格式的項的SQL語句:

INSERTINTOBOOKLIST(BookID,TITLE,AUTHOR,PUBLISHER,YEAR,ISBN,DESCRIPTION)VALUS(?,?,?,?,?,?,?)andBINDthevalues,
BOOKID->1234
TITLE->TheDifferenceBetweenGodandLarryEllison:InsideOracleCorporation
AUTHOR->MikeWilson
PUBLISHER->WilliamMorrow&Co.
YEAR->1997
ISBN->0688149251
Description->AccountofLarryEllison;
如下範例程式碼演示了Java程式中是如何完成此功能的:

 1 import oracle.xml.sql.dml.*;
 2 import java.sql.*;
 3 import oracle.jdbc.driver.*;
 4 import oracle.jdbc.*;
 5 import java.net.*;
 6 
 7 public class save_sample
 8 {
 9   public static void main (String args[]) throw SQLException
10   {
11 Srting tabName =”BOOKLIST”; // table into which to insert
12 String fileName =”samdoc.xml”; // file containing the xml doc
13 DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
14 Connection conn =
15 DriverManager.getConnection(“jdbc:oracle:oci8:scott/tiger@”);
16 OracleXMLSave sav = new OracleXMLSave(conn,tabName);
17 URL url = sav.createURL(fileName);
18 Int rowCount = sav.insertXML(url);
19 System.out.println(“successfully inserted “+rowCount+
20 “rows into “+tabName);
21 conn.close();
22   }
23 }

像getXML一樣,儲存功能也有一個命令列版本,叫做putXML。它可用於大量載入XML資料。如下的命令將載入一個XML文件,其中該文件中包含有與範例DTD相符合的書目列表。
JavaoraclexmlputXML?user“scott/tiger”sampdoc.xmlBookList

UpdataXML格式資料
更新操作可應用於表中的多行,這點和插入操作不同。如果匹配列不是表中的關鍵字列,則被更新的XML元素也許會匹配多行。所以更新操作需要一個關鍵字列的列表,其中該實用程式使用該列表來確定要更新的行。下面的書目列表更新例子說明了這種情況:

 1 <ROWSET>
 2   <ROW num=”1”>
 3 <BOOKID>1234</BOOKID>
 4 <TITLE> The Difference Between God and Larry Ellison: Inside Oracle
 5        Corporation </TITLE>
 6 <AUTHOR>Mike Wilson</AUTHOR>
 7 <PUBLISHER>William Morrow and Co.</PUBLISHER>
 8 <YEAR>1997</YEAR>
 9 <ISBN>0688149251</ISBN>
10   </ROW>
11 </ROWSET>

該XML更新會執行如下的傳遞BookID列和關鍵字列值的SQL語句:

UPDATEBOOKLISTSETTITLE=?,AUTHOR=?WHEREBOOKID=?
andbindthevalues,
BOOKID->1234
TITLE->TheDifferenceBetweenGodandLarryEllison:Inside
OracleCorporation
AUTHOR->MikeWilson;

請注意,不需要更新最初XML文件中的所有列。如下的範例程式碼給出了Java程式是如何完成此功能的:

 1 import oracle.xml.sql.dml.*;
 2 import java.sql.*;
 3 import oracle.jdbc.driver.*;
 4 import oracle.jdbc.*;
 5 public class ListUpdate
 6 {
 7   public static void main(String argv[]) throws SQLException
 8   {
 9 String tabName = “BOOKLIST”; // table into which to insert
10 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
11 Connection conn =
12   DriverManager.getConnection(“jdbc:oracle:oci8:scott/tiger@”);
13 OracleXMLSave sav = new OracleXMLSave(conn,tabName);
14 String [] keyColNames=new string[1];
15 keyColNames[0]=”BOOKID”;
16 sav.setKeyColumnNames(keyColNames);
17 sav.updateXML(argv[0]);
18 sav.close();
19   }
20 }

DeleteXML格式資料
XMLSQLUtility也支援XML文件的刪除操作。像更新操作一樣,刪除操作也使用關鍵字列來確定被刪除的行。如果沒有給出一個或多個關鍵字列,刪除操作仍將試著匹配文件中的列。下面是XML文件和對應的SQL刪除語句:

 1 <ROWSET>
 2    <ROW num=”1”>
 3        <BOOKID>1234</BOOKID>
 4        <TITLE> The Difference Between God and Larry Ellison: Inside Oracle
 5               Corporation</TITLE>
 6        <AUTHOR>Mike Wilson</AUTHOR>
 7        <PUBLISHER>William Morrow and Co. </PUBLISHER>
 8        <YEAR>1997</YEAR>
 9        <ISBN>0688149251</ISBN>
10 </ROW>
11 </ROWSET>

DELETEFROMBOOKLISTWHRETITLE=?ANDAUTHOR=?ANDPUBLISHER=?ANDYEAR=?ANDISBN=?ANDBOOKID=?
binding,
BOOKID<-1234
TITLE<-TheDifferenceBetweenGodandLarryEllison:Inside
OracleCorporation
AUTHOR<-MikeWilson
PUBLISHER<-WilliamMorrow&Co.
YEAR<-1997
ISBN<-0688149251

下例顯示了Java如何實現刪除操作,其中用BookID作為關鍵字列:

import oracle.xml.sql.dml.*;
import java.sql.*;
import oracle.jdbc.driver.*;
import oracle.jdbc.*;

public class ListDelete
{
  public static void main(String argv[]) throws SQLException
  {
     String tabName = “BOOKLIST” ; // table into which to delete data
     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
     Connection conn =
        DriverManager.getConnection(jdbc:oracle:oci8:scott/tiger@”);
     OracleXMLSave sav = new OracleXMLSave(conn, tabName);
     String [] keyColNames = new String[1];
     keyColNames[0] = “BookID”;
     sav.setKeyColmnNames(keyColNames);
     sav.deleteXML(argv[0]);
     sav.close();
  }
}