モジュール java.sql
パッケージ java.sql

インタフェースSQLXML


public interface SQLXML
SQL XML型のJavaTMプログラミング言語でのマッピングです。 XMLは、XML値をデータベース表の行内に列の値として格納する組込みの型です。 デフォルトでは、ドライバはSQLXMLオブジェクトをデータそのものではなく、XMLデータへの論理ポインタとして格納します。 SQLXMLオブジェクトは、それが生成されたトランザクションの期間中に有効です。

SQLXMLインタフェースは、String、ReaderまたはWriter、あるいはStreamとしてXML値にアクセスするためのメソッドを提供します。 XML値は、Sourceからアクセスしたり、Resultとして設定したりすることができ、XML Parser API (DOM、SAX、StAXなど)、XSLT変換、およびXPath評価で使用できます。

ResultSet、CallableStatement、PreparedStatementの各インタフェースのメソッド(getSQLXMLなど)を使用すると、プログラマはXML値にアクセスできます。 さらにこのインタフェースはXML値を更新するためのメソッドを備えています。

SQLXMLインスタンスのXML値は、次の式を使用してBinaryStreamとして取得できます。

   SQLXML sqlxml = resultSet.getSQLXML(column);
   InputStream binaryStream = sqlxml.getBinaryStream();
 
たとえば、DOMパーサーでXML値を構文解析するには、次のようにします。
   DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
   Document result = parser.parse(binaryStream);
 
ハンドラに対するSAXパーサーでXML値を構文解析するには、次のようにします。
   SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
   parser.parse(binaryStream, myHandler);
 
StAXパーサーでXML値を構文解析するには、次のようにします。
   XMLInputFactory factory = XMLInputFactory.newInstance();
   XMLStreamReader streamReader = factory.createXMLStreamReader(binaryStream);
 

データベースはXMLの最適化表現を使用できるため、getSource()およびsetResult()を使用して値にアクセスすると、ストリーム表現への直列化やXMLの構文解析を使用せずに、処理のパフォーマンスを向上させることができます。

たとえばDOM Documentノードを取得するには、次のようにします。

   DOMSource domSource = sqlxml.getSource(DOMSource.class);
   Document document = (Document) domSource.getNode();
 
DOM Documentノードの値をmyNodeに設定するには、次のようにします。
   DOMResult domResult = sqlxml.setResult(DOMResult.class);
   domResult.setNode(myNode);
 
SAXイベントをハンドラに送信するには、次のようにします。
   SAXSource saxSource = sqlxml.getSource(SAXSource.class);
   XMLReader xmlReader = saxSource.getXMLReader();
   xmlReader.setContentHandler(myHandler);
   xmlReader.parse(saxSource.getInputSource());
 
SAXイベントからの結果の値を設定するには、次のようにします。
   SAXResult saxResult = sqlxml.setResult(SAXResult.class);
   ContentHandler contentHandler = saxResult.getHandler();
   contentHandler.startDocument();
   // set the XML elements and attributes into the result
   contentHandler.endDocument();
 
StAXイベントを取得するには、次のようにします。
   StAXSource staxSource = sqlxml.getSource(StAXSource.class);
   XMLStreamReader streamReader = staxSource.getXMLStreamReader();
 
StAXイベントからの結果の値を設定するには、次のようにします。
   StAXResult staxResult = sqlxml.setResult(StAXResult.class);
   XMLStreamWriter streamWriter = staxResult.getXMLStreamWriter();
 
ファイルresultFileへのxsltFile出力でXSLTを使用して、XML値のXSLT変換を実行するには、次のようにします。
   File xsltFile = new File("a.xslt");
   File myFile = new File("result.xml");
   Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
   Source source = sqlxml.getSource(null);
   Result result = new StreamResult(myFile);
   xslt.transform(source, result);
 
XML値のXPath式を評価するには、次のようにします。
   XPath xpath = XPathFactory.newInstance().newXPath();
   DOMSource domSource = sqlxml.getSource(DOMSource.class);
   Document document = (Document) domSource.getNode();
   String expression = "/foo/@bar";
   String barValue = xpath.evaluate(expression, document);
 
XML値をXSLT変換の結果に設定するには:
   File sourceFile = new File("source.xml");
   Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
   Source streamSource = new StreamSource(sourceFile);
   Result result = sqlxml.setResult(null);
   xslt.transform(streamSource, result);
 
newTransformer()を呼び出すことで指定される恒等変換を使用して、任意のSourceをResultに変換できます。
   Transformer identity = TransformerFactory.newInstance().newTransformer();
   Source source = sqlxml.getSource(null);
   File myFile = new File("result.xml");
   Result result = new StreamResult(myFile);
   identity.transform(source, result);
 
Sourceの内容を標準出力に書き込むには:
   Transformer identity = TransformerFactory.newInstance().newTransformer();
   Source source = sqlxml.getSource(null);
   Result result = new StreamResult(System.out);
   identity.transform(source, result);
 
DOMResultからDOMSourceを作成するには:
    DOMSource domSource = new DOMSource(domResult.getNode());
 

不完全なXML値や無効なXML値が原因で、設定時にSQLExceptionが発生したり、execute()の発生時にこの例外が発生したりすることがあります。 すべてのストリームは、execute()の発生前にクローズする必要があります。そうでないと、SQLExceptionがスローされます。

SQLXMLオブジェクトに対するXML値の読書きは、多くても1回発生する可能性があります。 読込み可能および読込み不可能の概念的状態により、いずれかの読み込みAPIで値を返すか例外をスローするかが判断されます。 書込み可能および書込み不可能の概念的状態により、いずれかの書き込みAPIで値を設定するか例外をスローするかが判断されます。

free()または読み込みAPI (getBinaryStream()、getCharacterStream()、getSource()、getString())が呼び出されると、状態は読込み可能から読込み不可能に移ります。 実装によっては、このときに状態を書込み不可能に変更することもできます。

free()または書き込みAPIのいずれかが呼び出されると、状態は書き込み可能から書き込み不可能に移行: setBinaryStream()、setCharacterStream()、setResult()およびsetString()。 実装によっては、このときに状態を読込み不可能に変更することもできます。

JDBCドライバがそのデータ型をサポートする場合は、SQLXMLインタフェースのすべてのメソッドが完全に実装される必要があります。

導入されたバージョン:
1.6
関連項目: