Share via


Beispiel für den SQLXML-Datentyp

Diese Beispielanwendung für Microsoft SQL Server JDBC Driver veranschaulicht das Speichern von XML-Daten in einer relationalen Datenbank, das Abrufen von XML-Daten aus einer Datenbank sowie das Analysieren von XML-Daten mit dem Java-Datentyp SQLXML.

In den Codebeispielen in diesem Abschnitt wird ein SAX (Simple API for XML)-Parser verwendet. SAX ist ein öffentlich entwickelter Standard für die ereignisbasierte Analyse von XML-Dokumenten. Sie stellt außerdem eine Anwendungsprogrammierschnittstelle für die Arbeit mit XML-Daten bereit. Beachten Sie, dass in den Anwendungen ebenso jeder andere XML-Parser wie DOM (Document Object Model) oder StAX (Streaming API for XML) usw. verwendet werden kann.

DOM (Document Object Model) stellt eine programmgesteuerte Darstellung der XML-Dokumente, -Fragmente, -Knoten oder -Knotensätze bereit. Es stellt außerdem eine Anwendungsprogrammierschnittstelle für die Arbeit mit XML-Daten bereit. Entsprechend handelt es sich bei StAX (Streaming API for XML) um eine Java-basierte API für die Pullanalyse von XML.

Wichtig

Um die SAX-Parser-API verwenden zu können, müssen Sie die SAX-Standardimplementierung aus dem Paket javax.xml importieren.

Die Codedatei für dieses Beispiel heißt sqlxmlExample.java und befindet sich unter folgendem Pfad:

<Installationsverzeichnis>\sqljdbc_<Version>\<Sprache>\help\samples\datatypes

Anforderungen

Wenn Sie diese Beispielanwendung ausführen möchten, müssen Sie die Datei sqljdbc4.jar in den Klassenpfad aufnehmen. Wenn im Klassenpfad kein Eintrag für sqljdbc4.jar vorhanden ist, löst die Beispielanwendung die allgemeine Ausnahme "Klasse nicht gefunden" aus. Weitere Informationen zum Festlegen des Klassenpfads finden Sie unter Verwenden des JDBC-Treibers.

Außerdem benötigen Sie zum Ausführen dieser Beispielanwendung Zugriff auf die SQL Server 2005 AdventureWorks-Beispieldatenbank.

Beispiel

Der folgende Beispielcode stellt eine Verbindung mit der SQL Server 2005 AdventureWorks-Datenbank her und ruft dann die createSampleTables-Methode auf.

Mit der createSampleTables-Methode werden die Testtabellen TestTable1 und TestTable2 gelöscht, sofern vorhanden. Dann werden zwei Zeilen in TestTable1 eingefügt.

Darüber hinaus enthält das Codebeispiel die folgenden drei Methoden und eine zusätzliche Klasse mit dem Namen "ExampleContentHandler".

Die ExampleContentHandler-Klasse implementiert einen benutzerdefinierten Inhaltshandler, der Methoden für Parserereignisse definiert.

Die showGetters-Methode veranschaulicht das Analysieren der Daten im SQLXML-Objekt mit SAX, ContentHandler und XMLReader. Zunächst erstellt das Codebeispiel eine Instanz eines benutzerdefinierten Inhaltshandlers, dem ExampleContentHandler. Dann wird eine SQL-Anweisung erstellt und ausgeführt, die einen Datensatz aus TestTable1 zurückgibt. Anschließend werden im Codebeispiel ein SAX-Parser abgerufen und die XML-Daten analysiert.

Die showSetters-Methode veranschaulicht das Festlegen der xml-Spalte mit SAX, ContentHandler und ResultSet. Zunächst wird mit der createSQLXML-Methode der Connection-Klasse ein leeres SQLXML-Objekt erstellt. Dann wird eine Instanz eines Inhaltshandlers abgerufen, um die Daten in das SQLXML-Objekt zu schreiben. Anschließend werden die Daten im Codebeispiel in TestTable1 geschrieben. Schließlich durchläuft der Beispielcode die Datenzeilen im Resultset und liest die XML-Daten mithilfe der getSQLXML-Methode.

Die showTransformer-Methode veranschaulicht das Abrufen von XML-Daten aus der einen Tabelle, die dann mit SAX und Transformer in eine andere Tabelle eingefügt werden. Zunächst wird das SQLXML-Quellobjekt aus TestTable1 abgerufen. Dann wird mit der createSQLXML-Methode der Connection-Klasse ein leeres SQLXML-Zielobjekt erstellt. Daraufhin wird das SQLXML-Zielobjekt aktualisiert, und die XML-Daten werden in TestTable2 geschrieben. Schließlich durchläuft der Beispielcode die Datenzeilen im Resultset und liest die XML-Daten in TestTable2 mithilfe der getSQLXML-Methode.

import java.sql.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXTransformerFactory;

import org.xml.sax.*;

public class sqlxmlExample {

   public static void main(String[] args) {
       
      // Create a variable for the connection string.
      String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
            "databaseName=AdventureWorks;integratedSecurity=true;";

      // Declare the JDBC objects.
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      
      try {
         // Establish the connection.
         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
         con = DriverManager.getConnection(connectionUrl);

         // Create initial sample data.
         createSampleTables(con);
         
         // The showGetters method demonstrates how to parse the data in the 
         // SQLXML object by using the SAX, ContentHandler and XMLReader.  
         showGetters(con);            

         // The showSetters method demonstrates how to set the xml column 
         // by using the SAX, ContentHandler, and ResultSet.
         showSetters(con);   
         
         // The showTransformer method demonstrates how to get an XML data 
         // from one table and insert that XML data to another table 
         // by using the SAX and the Transformer. 
         showTransformer(con);        
      }
      // Handle any errors that may have occurred.
      catch (Exception e) {
         e.printStackTrace();
      }
      finally {
         if (rs != null) try { rs.close(); } catch(Exception e) {}
         if (stmt != null) try { stmt.close(); } catch(Exception e) {}
         if (con != null) try { con.close(); } catch(Exception e) {}
      }
   }
  
   private static void showGetters(Connection con) {
       
      try {
          // Create an instance of the custom content handler.   
          ExampleContentHandler myHandler = new ExampleContentHandler();
           
          // Create and execute an SQL statement that returns a
          // set of data.       
          String SQL = "SELECT * FROM TestTable1";
          Statement stmt = con.createStatement();
          ResultSet rs = stmt.executeQuery(SQL);
      
          rs.next();
        
          SQLXML xmlSource = rs.getSQLXML("Col3");
        
          // Send SAX events to the custom content handler.
          SAXSource sxSource =  xmlSource.getSource(SAXSource.class);
          XMLReader xmlReader = sxSource.getXMLReader();
          xmlReader.setContentHandler(myHandler);
          
          System.out.println("showGetters method: Parse an XML data in TestTable1 => ");
          xmlReader.parse(sxSource.getInputSource());
        
      } catch (Exception e) {
          e.printStackTrace();
      }
   }
   
   private static void showSetters(Connection con) {

      try {
         // Create and execute an SQL statement, retrieving an updatable result set.
         String SQL = "SELECT * FROM TestTable1;";
         Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
         ResultSet rs = stmt.executeQuery(SQL);
           
         // Create an empty SQLXML object.
         SQLXML sqlxml = con.createSQLXML();
 
         // Set the result value from SAX events.
         SAXResult sxResult = sqlxml.setResult(SAXResult.class);
         ContentHandler myHandler = sxResult.getHandler();

         // Set the XML elements and attributes into the result.
         myHandler.startDocument();
         myHandler.startElement(null, "contact", "contact", null);
         myHandler.startElement(null, "name", "name", null);
         myHandler.endElement(null, "name", "name");
         myHandler.startElement(null, "phone", "phone", null);
         myHandler.endElement(null, "phone", "phone");         
         myHandler.endElement(null, "contact", "contact");
         myHandler.endDocument();

         // Update the data in the result set.
         rs.moveToInsertRow();
         rs.updateString("Col2", "C");
         rs.updateSQLXML("Col3", sqlxml);
         rs.insertRow();
           
         // Display the data. 
         System.out.println("showSetters method: Display data in TestTable1 => ");
         while (rs.next()) {
           System.out.println(rs.getString("Col1") + " : " + rs.getString("Col2"));
           SQLXML xml = rs.getSQLXML("Col3");              
           System.out.println("XML column : " + xml.getString());
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   private static void showTransformer(Connection con) {

      try {
          // Create and execute an SQL statement that returns a
          // set of data.       
          String SQL = "SELECT * FROM TestTable1";
          Statement stmt = con.createStatement();
          ResultSet rs = stmt.executeQuery(SQL);
           
          rs.next();
            
          // Get the value of the source SQLXML object from the database.
          SQLXML xmlSource = rs.getSQLXML("Col3");
            
          // Get a Source to read the XML data. 
          SAXSource sxSource =  xmlSource.getSource(SAXSource.class);
            
         // Create a destination SQLXML object without any data.
         SQLXML xmlDest = con.createSQLXML();

         // Get a Result to write the XML data.
         SAXResult sxResult = xmlDest.setResult(SAXResult.class);
            
         // Transform the Source to a Result by using the identity transform.
         SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance();
         Transformer identity = stf.newTransformer();
         identity.transform(sxSource, sxResult);

         // Insert the destination SQLXML object into the database.
         PreparedStatement psmt = 
           con.prepareStatement(
              "INSERT INTO TestTable2" + " (Col2, Col3, Col4, Col5) VALUES (?, ?, ?, ?)");
         psmt.setString(1, "A");
         psmt.setString(2, "Test data");
         psmt.setInt(3, 123);
         psmt.setSQLXML(4, xmlDest);
         psmt.execute();
            
         // Execute the query and display the data. 
         SQL = "SELECT * FROM TestTable2";
         stmt = con.createStatement();
         rs = stmt.executeQuery(SQL);

         System.out.println("showTransformer method : Display data in TestTable2 => ");
         while (rs.next()) {
            System.out.println(rs.getString("Col1") + " : " + rs.getString("Col2"));
            System.out.println(rs.getString("Col3") + " : " + rs.getInt("Col4"));
              
            SQLXML xml = rs.getSQLXML("Col5");              
            System.out.println("XML column : " + xml.getString());
         }
     } catch (Exception e) {
        e.printStackTrace();
     }
   }
   
   private static void createSampleTables(Connection con) {

      try {
      Statement stmt = con.createStatement();
          
          // Drop the tables.
      stmt.executeUpdate("if exists (select * from sys.objects where name = 'TestTable1')" +
                "drop table TestTable1" );

          stmt.executeUpdate("if exists (select * from sys.objects where name = 'TestTable2')" +
                "drop table TestTable2" );        

          // Create empty tables.
          stmt.execute("CREATE TABLE TestTable1 (Col1 int IDENTITY, Col2 char, Col3 xml)");
          stmt.execute("CREATE TABLE TestTable2 (Col1 int IDENTITY, Col2 char, Col3 varchar(50), Col4 int, Col5 xml)");

          // Insert two rows to the TestTable1.
         String row1 = "<contact><name>Contact Name 1</name><phone>XXX-XXX-XXXX</phone></contact>";
         String row2 = "<contact><name>Contact Name 2</name><phone>YYY-YYY-YYYY</phone></contact>";

         stmt.executeUpdate("insert into TestTable1" + " (Col2, Col3) values('A', '" + row1 +"')");
         stmt.executeUpdate("insert into TestTable1" + " (Col2, Col3) values('B', '" + row2 +"')");
          
       } catch (Exception e) {
          e.printStackTrace();
       }
   }
}

class ExampleContentHandler implements ContentHandler {

  public void startElement(String namespaceURI, String localName, String qName, Attributes atts) 
  throws SAXException {
      System.out.println("startElement method: localName => " + localName);
  }
  public void characters(char[] text, int start, int length) throws SAXException {
      System.out.println("characters method");  
  }
  public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
      System.out.println("endElement method: localName => " + localName);          
  } 
  public void setDocumentLocator(Locator locator) {
      System.out.println("setDocumentLocator method");
  }
  public void startDocument() throws SAXException {
      System.out.println("startDocument method");
  }
  public void endDocument() throws SAXException {
      System.out.println("endDocument method");
  }
  public void startPrefixMapping(String prefix, String uri) throws SAXException {
      System.out.println("startPrefixMapping method: prefix => " + prefix);
  }
  public void endPrefixMapping(String prefix) throws SAXException {
      System.out.println("endPrefixMapping method: prefix => " + prefix);
  }
  public void skippedEntity(String name) throws SAXException {
      System.out.println("skippedEntity method: name => " + name);
  }  
  public void ignorableWhitespace(char[] text, int start, int length) throws SAXException {
      System.out.println("ignorableWhiteSpace method");
  }
  public void processingInstruction(String target, String data) throws SAXException {
      System.out.println("processingInstruction method: target => " + target);
  }
}

Siehe auch

Andere Ressourcen

Arbeiten mit Datentypen (JDBC)