Dela via


Exempel på SQLXML-datatyp

Ladda ned JDBC-drivrutin

Den här Microsoft JDBC-drivrutinen för SQL Server-exempelprogrammet visar hur du lagrar XML-data i en relationsdatabas, hur du hämtar XML-data från en databas och hur du parsar XML-data med SQLXML Java-datatypen.

Kodexemplen i det här avsnittet använder en SAX-parser (Simple API for XML). SAX är en offentligt utvecklad standard för händelsebaserad parsning av XML-dokument. Det tillhandahåller också ett programmeringsgränssnitt för program för att arbeta med XML-data. Program kan också använda andra XML-parser, till exempel DOKUMENTobjektmodell (DOM) eller strömnings-API för XML (StAX) eller så vidare.

Dokumentobjektmodellen (DOM) tillhandahåller en programmatisk representation av XML-dokument, fragment, noder eller noduppsättningar. Det tillhandahåller också ett programmeringsgränssnitt för program för att arbeta med XML-data. På samma sätt är strömnings-API:et för XML (StAX) ett Java-baserat API för pull-parsning av XML.

Viktigt!

För att kunna använda SAX-parser-API:et måste du importera SAX-standardimplementeringen från javax.xml-paketet.

Kodfilen för det här exemplet heter SqlXmlDataType.java och finns på följande plats:

\<installation directory>\sqljdbc_<version>\<language>\samples\datatypes

Kravspecifikation

Om du vill köra det här exempelprogrammet måste du ange att klassökvägen ska innehålla filen sqljdbc4.jar. Om klassökvägen saknar en post för sqljdbc4.jar utlöser exempelprogrammet undantaget "Klassen hittades inte". Mer information om hur du anger klassökvägen finns i Använda JDBC-drivrutinen.

Du behöver också åtkomst till Exempeldatabasen AdventureWorks2025 för att köra det här exempelprogrammet.

Example

I följande exempel upprättar exempelkoden en anslutning till databasen AdventureWorks2025 och anropar sedan metoden createSampleTables.

Metoden createSampleTables släpper testtabellerna TestTable1 och TestTable2 om de finns. Sedan infogas två rader i TestTable1.

Kodexemplet innehåller också följande tre metoder och en annan klass, som heter ExampleContentHandler.

Klassen ExampleContentHandler implementerar en anpassad innehållshanterare som definierar metoder för parsningshändelser.

Metoden showGetters visar hur du parsar data i SQLXML-objektet med hjälp av SAX, ContentHandler och XMLReader. Först skapar kodexemplet en instans av en anpassad innehållshanterare, som är ExampleContentHandler. Därefter skapar och kör den en SQL-instruktion som returnerar en uppsättning data från TestTable1. Sedan hämtar kodexemplet en SAX-parser och parsar XML-data.

Metoden showSetters visar hur du ställer in xml-kolumnen med hjälp av SAX, ContentHandler och ResultSet. Först skapar det ett tomt SQLXML-objekt med hjälp av metoden createSQLXML i klassen Anslutning. Sedan hämtar den en instans av en innehållshanterare för att skriva data till SQLXML-objektet. Därefter skriver kodexemplet data till TestTable1. Slutligen itererar exempelkoden genom raderna med data som finns i resultatuppsättningen och använder metoden getSQLXML för att läsa XML-data.

Metoden showTransformer visar hur du hämtar XML-data från en tabell och infogar XML-data i en annan tabell med hjälp av SAX och Transformer. Först hämtar det SQLXML-källobjektet från TestTable1. Sedan skapas ett tomt SQLXML-målobjekt med hjälp av metoden createSQLXML i klassen Anslutning. Därefter uppdateras SQLXML-målobjektet och XML-data skrivs till TestTable2. Slutligen itererar exempelkoden genom raderna med data som finns i resultatuppsättningen och använder metoden getSQLXML för att läsa XML-data i TestTable2.

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLXML;
import java.sql.Statement;

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

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;


public class SqlXmlDataType {

    public static void main(String[] args) {

        // Create a variable for the connection string.
        String connectionUrl = "jdbc:sqlserver://<server>:<port>;databaseName=<database>;username=<user>;password=<password>;";

        // Establish the connection.
        try (Connection con = DriverManager.getConnection(connectionUrl);
                Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)) {

            // Create initial sample data.
            createSampleTables(stmt);

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

            // The showSetters method demonstrates how to set the xml column
            // by using the SAX, ContentHandler, and ResultSet.
            showSetters(con, stmt);

            // 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, stmt);
        }
        // Handle any errors that may have occurred.
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void showGetters(Statement stmt) throws IOException, SAXException, SQLException {

        // Create an instance of the custom content handler.
        ExampleContentHandler myHandler = new ExampleContentHandler();

        // Create and execute a SQL statement that returns a
        // set of data.
        String SQL = "SELECT * FROM TestTable1";

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

    private static void showSetters(Connection con, Statement stmt) {

        // Create and execute a SQL statement, retrieving an updatable result set.
        String SQL = "SELECT * FROM TestTable1;";
        try (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, Statement stmt) throws Exception {

        // Create and execute a SQL statement that returns a
        // set of data.
        String SQL = "SELECT * FROM TestTable1";
        try (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.
            try (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";
        try (ResultSet 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());
            }
        }
    }

    private static void createSampleTables(Statement stmt) throws SQLException {
        // 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 + "')");
    }
}

/**
 * Handles output for XML elements for the test.
 */
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);
    }
}

Se även

Arbeta med datatyper (JDBC)