mysql中xml类型_使用 SQLXML 数据类型
使用 SQLXML 數據類型
適用于數據庫 XML 類型的 Java 數據類型
Deepak Vohra
2006 年 6 月 10 日發布
概述
J2EE 開發人員通常需要在關系數據庫中存儲 XML 文檔以及從數據庫中檢索 XML 文檔,以獲得元素值和屬性值。目前,只有特定于供應商的技術和數據類型可用于在關系數據庫中存儲 XML 文檔。例如 IBM DB2 Universal Database? (UDB) 提供了 DB2 XML Extender 和 XML 用戶定義類型 (UDT) 來存儲 XML 文檔。用于 XML 類型列的標準數據類型和對應于 XML 類型列的 Java 數據類型將促進關系數據庫中 XML 文檔的存儲和檢索。SQL:2003 標準支持這樣一種數據類型:新 XML 數據類型,以便在關系數據庫中存儲 XML 文檔。借助 XML 數據類型,您可以在類似于其他數據類型的數據庫表列中存儲 XML 文檔。DB2 Viper(即 DB2 UDB Version 9.1)支持 XML 數據類型。Java Database Connectivity (JDBC) 4.0 規范支持 SQL:2003 標準。
初步設置
在開始之前,確保擁有必要的組件。SQLXML 是一種 JDBC 4.0 數據類型。因為 SQLXML 數據類型是在 Sun 提供的 Java SE 6 Development Kit (JDK) 6.0 Beta 中實現的,所以您需要安裝它。另一個要求是創建一個 SQLXML 類型對象,該對象是一個支持 XML 數據類型的關系數據庫。DB2 Viper(即 DB2 UDB Version 9.1)支持 XML 數據類型。要運行本文中包含的示例應用程序 SQLXMLDB.java,需要安裝 DB2 Viper 數據庫,并創建示例 DB2 數據庫實例 Sample。JDK 6.0 Beta、DB2 Viper 和 SQLXMLDB.java 可以分別從 參考資料 和 下載 中獲得。
您還需要一個 JDBC 4.0 驅動程序,但 DB2 UDB 目前并沒有提供 JDBC 4.0 驅動程序,要運行帶有 DB2 JDBC 3.0 驅動程序的 SQLXMLDB.java 并確定 DB2 數據庫是否支持 XML 數據類型,需要將 JAR 文件 C:/Program Files/IBM/SQLLIB/java/db2jcc.jar 和 C:/Program Files/IBM/SQLLIB/java/db2jcc_license_cu.jar 添加到 Classpath 中。當 JDBC 4.0 驅動程序變得可用時,就可以利用 SQLXML API 運行 SQLXMLDB.java 了。當 JDBC 4.0 驅動程序變得可用時,本文將被更新。
開始
SQLXML Java 數據類型允許您將 XML 類型數據庫列映射到 Java 數據類型。在 JDBC 4.0 規范中,java.sql.Connection 接口可以創建一個最初沒有任何數據的 SQLXML 對象,但您可以用 setString(String) 方法或 createXMLStreamWriter() 方法添加數據。SQLXML 對象可利用 getSQLXML(int columnIndex) 方法或 getSQLXML(String columnName) 方法從 ResultSet 或 CallableStatement 對象中獲得。可以用 getString() 方法或 createXMLStreamReader() 方法檢索 SQLXML 對象中的數據,還可以用 PreparedStatement 接口的 setSQLXML(int parameterIndex, SQLXML sqlXML) 方法在類似于其他任何數據類型的類型 XML 的數據庫表列中存儲 SQLXML 對象。
清單 1 顯示了一個您可以創建的 XML 文檔的例子,即 catalog.xml:
清單 1. 示例 XML 文檔 catalog.xml
Managing XML data: Tag URIsElliotte Harold
Practical data binding: XPath as data binding tool, Part 2Brett McLaughlin
選擇數據庫
需要一個關系數據庫來支持 XML 數據類型存儲 XML 文檔,不是所有的數據庫都支持 XML 數據類型。要確定數據庫是否支持該數據庫類型,需要從 Connection 對象中獲得數據庫元數據。例如,要測試 DB2 Viper 是否支持 XML 數據類型,需要加載并注冊 com.ibm.db2.jcc.DB2Driver JDBC 驅動程序,即 DB2 JDBC Type 4 驅動程序:Class.forName("com.ibm.db2.jcc.DB2Driver");
為 DB2 UDB 數據庫指定連接 URL。DB2 UDB Type 4 驅動程序的格式為 jdbc:db2://:/。在此連接 URL 中, 是 DB2 UDB 服務器名稱, 是 DB2 數據庫端口,而 是 DB2 數據庫實例。DB2 UDB 數據庫的連接 URL 是:String url = "jdbc:db2://localhost:50000/Sample";
利用 DriverManager 的靜態方法 getConnection() 獲得與數據庫的 Connection:Connection connection = DriverManager.getConnection(url,
"username", "password");
接下來,從 Connection 對象獲得數據庫元數據:DatabaseMetaData metadata = connection.getMetaData();
然后,利用 getTypeInfo() 方法獲得受數據庫支持的數據類型:ResultSet rs = metadata.getTypeInfo();
在數據類型結果集上進行迭代并輸出 TYPE_NAME 列:System.out.println("TYPE_NAME:"+rs.getString("TYPE_NAME"));
如果數據庫支持 XML 數據類型,則 XML TYPE_NAME 獲得輸出。由于 DB2 Viper 數據庫支持 XML 數據類型,所以運行 SQLXMLDB.java 應用程序所得到的輸出包括 XML 數據類型,如下所示:TYPE_NAME: XML
創建 SQLXML 對象
這一節將討論創建 SQLXML 對象的過程。首先,導入 java.sql package 和 javax.xml.stream 包。javax.xml.stream 包具有實例化 SQLXML 對象和獲得 SQLXML 對象中的數據所需的 XMLStreamWriter 和 XMLStreamReader 接口。import java.sql.*;
import javax.xml.stream.*;
XML 文檔在類型為 XML 的數據庫表列中的 Java 表示是 SQLXML。要創建一個將存儲在 XML 類型列中的 XML 文檔,需要使用 createSQLXML() 方法從 Connection 對象創建一個 SQLXML 對象:SQLXML sqlXML = connection.createSQLXML();
用 createSQLXML() 方法創建的 SQLXML 對象不包含任何數據。下一節 將展示如何將數據添加到 SQLXML 對象中。
初始化 SQLXML 對象
您可以使用 XMLStreamWriter 對象創建一個 XML 文檔。可以使用 createXMLStreamWriter() 方法從 SQLXML 對象中創建 XMLStreamWriter 對象:XMLStreamWriter xmlStreamWriter = sqlXML.createXMLStreamWriter();
如果調用 createXMLStreamWriter() 方法,而不是使用相同的 SQLXML 對象,則會拋出 SQLException,并且先前返回的 XMLStreamWriter 對象不受影響。
用 writeStartDocument(String encoding, String version) 方法添加 XML 文檔的開始部分。writeStartDocument() 方法中指定的編碼并沒有設置 XML 文檔輸出的編碼;指定的編碼只設置 XML 聲明中的編碼。XMLStreamWriter 接口還包括 writeStartDocument() 方法和 writeStartDocument(String version) 方法,前者用于在沒有指定編碼和版本的情況下創建 XML 文檔,后者用于在提供版本的情況下創建 XML 文檔:xmlStreamWriter.writeStartDocument("UTF-8","1.0");
用 writeStartElement(String localName) 方法(如下面代碼片段所示)添加根元素 catalog 的開始部分。使用 writeStartElement(String prefix, String localName, String namespaceURI) 方法根據名稱空間和前綴創建一個元素。使用 writeEmptyElement(String localName) 方法可生成一個空元素:xmlStreamWriter.writeStartElement("catalog");
用 writeAttribute(String localName, String value) 方法添加 title 屬性,如下面代碼片段所示。同樣,還可以添加 publisher 屬性。如果屬性有一個名稱空間前綴,則使用方法 writeAttribute(String prefix, String namespaceURI, String localName, String value):xmlStreamWriter.writeAttribute("title", "XML Zone");
xmlStreamWriter.writeAttribute("publisher", "IBM developerWorks");
類似地,還可以添加 journal 元素及其屬性 date:xmlStreamWriter.writeStartElement("journal");
xmlStreamWriter.writeAttribute("date", "Jan 2006");
添加一個 article 元素和一個 title 元素:xmlStreamWriter.writeStartElement("article");
xmlStreamWriter.writeStartElement("title");
用 writeCharacters(String text) 方法將文本添加到 title 元素中,如下面代碼片段所示。此外,可以使用 writeCharacters(char[] text,int start,int len) 方法從 char[] 數組中添加文本。xmlStreamWriter.writeCharacters("Managing XML data: Tag URIs");
確保 start 元素有一個相應的 end 元素標記。使用 writeEndElement() 方法添加一個 end 元素:xmlStreamWriter.writeEndElement();
writeEndElement() 方法沒有像 writeStartElement() 方法那樣指定元素的本地名稱。類似地,可以添加其他元素來創建 清單 1 中所示的 XML 文檔。要完成 XML 文檔,請調用 writeEndDocument() 方法。此外,請關閉 XMLStreamWriter 對象:xmlStreamWriter.writeEndDocument();
xmlStreamWriter.close();
您還可以使用 SQLXML 接口的 setString(String) 方法將 XML 文檔從 XML 字符串添加到 SQLXML 對象中,如 清單 2 所示。如果在前面已初始化的 SQLXML 對象上調用 setString(String) 方法,則會拋出 SQLException。
清單 2. 將 XML 文檔添加到 SQLXML 對象中sqlXML.setString("
Managing XML data: Tag URIsElliotte Harold
Practical data binding: XPath as data binding tool, Part 2Brett McLaughlin
");
下一節 解釋如何將創建的 SQLXML 對象存儲到數據庫中。
存儲 SQLXML 對象
SQLXML Java 數據類型存儲在 XML 文檔中,就像其他任何 Java 數據類型那樣。首先,用 XML 類型列創建一個數據庫表。可以借助 SQL 命令行工具或 JDBC API,用 XML 類型列創建數據庫表。要用 JDBC 創建數據庫表,需要從 Connection 對象中獲得一個 Statement 對象:Statement stmt = connection.createStatement();
用 XML 類型列創建一個數據庫表,比如 Catalog:stmt.executeUpdate("CREATE Table Catalog(CatalogId INTEGER, Catalog XML)");
將 前一節 中創建的 SQLXML 對象添加到數據庫中。創建一個 PreparedStatement 對象,以便將值添加到數據庫表 Catalog 中。PreparedStatement 由 INSERT SQL 語句和用來添加到數據庫的那些值的參數標志符組成:PreparedStatement statement =
connection.prepareStatement("INSERT INTO CATALOG(catalogId, catalog) VALUES(?,?)");
用 setInt(int parameterIndex, int value) 方法設置 int 值,用 PreparedStatement 接口的 setSQLXML(int parameterIndex, SQLXML value) 方法設置 SQLXML 值,如下所示。如果沒有在調用 setSQLXML() 方法前關閉 XMLStreamWriter 對象,則會拋出 SQLException。statement.setInt(1, 1);
statement.setSQLXML(2, sqlXML);
用 executeUpdate() 方法更新數據庫:statement.executeUpdate();
SQLXML 對象至少在創建 SQLXML 對象期間是有效的。如果不使用某個 SQLXML 對象,則可以使用 free() 方法釋放這個 SQLXML 對象資源:sqlXML.free();
更新 SQLXML 對象
JDK 6.0 Beta 還在 ResultSet 接口中提供了一些 updater 方法來更新 SQLXML 值。updater 方法 updateSQLXML(int columnIndex, SQLXML sqlXML) 和 updateSQLXML(String columnName, SQLXML sqlXML) 可修改當前行中的 SQLXML 值或 ResultSet 對象的插入行。例如,要在 ResultSet 對象中添加新行,需要獲得一個不可更新的 ResultSet 類型的 Statement 對象:Statement stmt = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
從數據庫表 Catalog 獲得一個 ResultSet,該表有一個 XML 類型的列。可以移動 ResultSet 游標來插入一個行。還可以使用 updateSQLXML() 方法添加 SQLXML 列值。updateSQLXML() 方法不更新數據庫。要更新數據庫,需要調用 insertRow() 方法:ResultSet rs = stmt.executeQuery("SELECT * from Catalog");
rs.moveToInsertRow();
rs.updateSQLXML(2, xmlObject);
rs.insertRow();
此外,要在可滾動的 ResultSet 中從當前行更新 ResultSet,需要使用 absolute(int) 或 relative(int) 方法移動到 ResultSet 行。可以使用 updater 方法之一修改 SQLXML 值。使用 updateRow() 方法更新數據庫:rs.absolute(5);
updateSQLXML("catalog", xmlObject)
rs.updateRow();
如果沒有在調用 updater 方法之前關閉 XMLStreamWriter 對象,則會拋出 SQLException。
從 ResultSet 對象檢索 SQLXML 對象
以 SQLXML 數據類型的形式檢索 XML 數據庫類型列值。為 SELECT SQL 查詢創建一條 PreparedStatement,以便從數據庫表 Catalog 中獲得 ResultSet,如下面代碼片段所示。SQL 語句有一個用于 CatalogId 值的參數標志符。PreparedStatement stmt =
connection.prepareStatement("SELECT * FROM CATALOG WHERE CatalogId=?");
指定將從中檢索 XML 文檔的 CatalogId 值:stmt.setInt(1, 1);
用 executeQuery() 方法獲得一個結果集:ResultSet rs = stmt.executeQuery();
使用 ResultSet 接口的方法 getSQLXML(int columnIndex) 或 getSQLXML(String columnName) 獲得用于 XML 類型 Catalog 列的 SQLXML 對象:SQLXML sqlXML = rs.getSQLXML("Catalog");
要在 SQLXML 對象中輸出 XML 文檔,可能需要使用 SQLXML 接口的 getString() 方法:System.out.println(sqlXML.getString());
訪問 SQLXML 對象
使用 XMLStreamReader 接口讀取具有事件迭代器的 SQLXML 對象中的 XML 文檔。從將被導航的 SQLXML 對象中創建一個 XMLStreamReader 對象:XMLStreamReader xmlStreamReader = sqlXML.createXMLStreamReader();
下一個解析事件是用 next() 方法獲得的:while(xmlStreamReader.hasNext()){
int parseEvent = xmlStreamReader.next();
}
next() 方法返回一個對應于 XMLStreamConstants 常量的 int 值。表 1 列出了 next() 方法的返回值。
表 1. 方法 next() 的返回值解析事件描述ATTRIBUTE指定一個屬性
CDATACData 部分
CHARACTERS文本
NOTATION_DECLARATION指定一個符號聲明
COMMENTXML 文檔注釋
PROCESSING_INSTRUCTION指定一個處理指令
START_DOCUMENT指定文檔的開始處
START_ELEMENT指定元素的開始處
END_ELEMENT指定元素的結尾處
ENTITY_DECLARATION指定一個實體聲明
ENTITY_REFERENCE指定一個實體引用
NAMESPACE指定一個名稱空間聲明
SPACE指定一個可忽略的空白
END_DOCUMENT指定文檔的結尾處
DTD指定一個 DTD
如果返回值是 START_ELEMENT,則解析事件指示某一元素已經被解析。可以使用方法 getLocalName()、getPrefix()、getNamespaceURI() 獲得本地名稱、前綴和名稱空間元素:if(parseEvent==XMLStreamConstants.START_ELEMENT){
System.out.println("Element Local Name: "+xmlStreamReader.getLocalName());
System.out.println("Element Prefix: "+xmlStreamReader.getPrefix());
System.out.println("Element Namespace:"+xmlStreamReader.getNamespaceURI());
}
可以使用 getAttributeCount() 方法獲得元素中的屬性總數。還可以在屬性上進行迭代,使用 getAttributeLocalName() 方法獲得屬性本地名稱,使用 getAttributeValue() 方法獲得屬性值,使用 getAttributePrefix() 方法獲得屬性前綴,以及使用 getAttributeNamespace() 方法獲得屬性名稱空間:for(int i=0; i
System.out.println("Attribute Prefix:"+xmlStreamReader.getAttributePrefix(i));
System.out.println("Attribute Namespace:"+xmlStreamReader.getAttributeNamespace(i));
System.out.println("Attribute Local Name:"+xmlStreamReader.getAttributeLocalName(i));
System.out.println("Attribute Value:"+xmlStreamReader.getAttributeValue(i));
}
如果解析事件的類型為 CHARACTERS,可使用 getText() 方法獲得解析事件的文本:if(parseEvent==XMLStreamConstants.CHARACTERS){
System.out.println("CHARACTERS text: "+xmlStreamReader.getText());
}
結束語
SQLXML 數據類型為數據庫類型 XML 提供了數據庫到 Java 的映射工具。您可以對任何支持 XML 數據類型并提供 JDBC 4.0 驅動程序的數據庫使用 SQLXML 數據類型。特定于供應商的 XML-to-SQL API 對 SQLXML 不是必需的。SQLXML API 將包含在 JDK 6.0 中。DB2 Viper 支持 XML 數據類型。
下載資源
相關主題您可以參閱本文在 developerWorks 全球站點上的 英文原文。
DB2 UDB Version 9:下載和測試促使 DB2 Viper 更多地了解這種既支持關系存儲又支持 XML 存儲的混合數據服務器。
JDK 6.0 Beta:獲得實現 SQLXML 的 JDK。
專家訪談: Susan Malaika 討論 DB2 中的 XML 功能(developerWorks,2002 年 12 月):在這一期 專家訪談 中,學習關于 DB2 數據庫中的 XML 支持的知識。
DB2 UDB 和 DB2 XML Extender 中 SQL/XML 函數的介紹(developerWorks,2003 年 11 月):閱讀這篇關于 DB2 UDB 和 DB2 XML Extender 中的 SQL/XML 功能的介紹。
SQL/XML 發布函數簡介(developerWorks,2005 年 11 月):了解 SQL/XML 發布功能。
用 SQL 查詢 DB2 XML 數據(developerWorks,2006 年 3 月):了解如何使用 SQL 和 SQL/XML 查詢存儲在 XML 列中的數據。
developerWorks XML 專區:在這里可以找到更多的 XML 參考資料,其中包括一些文章、教程、提示和標準。
總結
以上是生活随笔為你收集整理的mysql中xml类型_使用 SQLXML 数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php协程实现mysql异步_swool
- 下一篇: mysql语法6_全面接触SQL语法(6