關於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;
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(); } }