다음을 통해 공유


SQLXML 데이터 형식 샘플

JDBC 드라이버 다운로드

이 SQL Server용 Microsoft JDBC 드라이버 샘플 애플리케이션은 XML 데이터를 관계형 데이터베이스에 저장하는 방법, XML 데이터를 데이터베이스에서 검색하는 방법 및 SQLXML Java 데이터 형식으로 XML 데이터를 구문 분석하는 방법을 보여 줍니다.

이 섹션의 코드 예제에서는 SAX(Simple API for XML) 파서가 사용됩니다. SAX는 XML 문서의 이벤트 기반 구문 분석을 위해 공개적으로 개발된 표준입니다. 또한 XML 데이터 작업 시 사용되는 애플리케이션 프로그래밍 인터페이스도 제공합니다. 애플리케이션은 DOM(문서 개체 모델) 또는 StAX(Streaming API for XML) 등 다른 XML 파서도 사용할 수 있습니다.

DOM(문서 개체 모델)은 XML 문서, 조각, 노드 또는 노드 집합의 프로그래밍 방식 표현을 제공합니다. 또한 XML 데이터 작업 시 사용되는 애플리케이션 프로그래밍 인터페이스도 제공합니다. 이와 유사하게 StAX(Streaming API for XML)는 당겨받기 구문 분석 XML에 대한 Java 기반 API입니다.

Important

SAX 파서 API를 사용하려면 javax.xml 패키지에서 표준 SAX 구현을 가져와야 합니다.

이 샘플의 코드 파일 이름은 SqlXmlDataType.java이며 다음과 같은 위치에 있습니다.

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

요구 사항

이 샘플 애플리케이션을 실행하려면 sqljdbc4.jar 파일을 포함하도록 클래스 경로를 설정해야 합니다. 클래스 경로에 sqljdbc4.jar에 대한 항목이 누락되어 있다면 샘플 애플리케이션에서 "클래스를 찾을 수 없음" 예외가 발생합니다. 클래스 경로를 설정하는 방법에 대한 자세한 내용은 JDBC 드라이버 사용을 참조하세요.

이 샘플 애플리케이션을 실행하려면 AdventureWorks2022 샘플 데이터베이스에 대한 액세스 권한도 필요합니다.

예시

다음 예제의 샘플 코드에서는 AdventureWorks2022 데이터베이스에 연결한 다음, createSampleTables 메서드를 호출합니다.

createSampleTables 메서드는 테스트 테이블인 TestTable1 및 TestTable2가 있다면 이러한 테이블을 삭제합니다. 그런 다음 TestTable1에 행 두 개를 삽입합니다.

또한 코드 샘플에는 다음과 같은 세 개의 메서드와 ExampleContentHandler라는 클래스도 포함되어 있습니다.

ExampleContentHandler 클래스는 사용자 지정 콘텐츠 처리기를 구현하며, 이는 파서 이벤트의 메서드를 정의합니다.

showGetters 메서드는 SAX, ContentHandler 및 XMLReader를 사용하여 SQLXML 개체의 데이터를 구문 분석하는 방법을 보여 줍니다. 먼저 코드 샘플은 사용자 지정 콘텐츠 처리기의 인스턴스를 만들고 이는 ExampleContentHandler입니다. 다음으로 TestTable1에서 데이터 집합을 반환하는 SQL 문을 만들고 실행합니다. 그런 다음 코드 예제에서 SAX 파서를 받아 XML 데이터를 구문 분석합니다.

showSetters 메서드는 SAX, ContentHandler 및 ResultSet을 사용하여 xml 열을 설정하는 방법을 보여 줍니다. 먼저 Connection 클래스의 createSQLXML 메서드를 사용하여 빈 SQLXML 개체를 만듭니다. 그런 다음, SQLXML 개체에 데이터를 쓰는 콘텐츠 처리기의 인스턴스를 가져옵니다. 다음으로, 코드 예제에서는 TestTable1에 데이터를 씁니다. 마지막으로 샘플 코드는 결과 집합에 있는 데이터 행을 통해 반복하며 getSQLXML 메서드를 사용하여 XML 데이터를 읽습니다.

showTransformer 메서드는 SAX 및 Transformer를 사용하여 한 테이블에서 XML 데이터를 가져온 다음 다른 테이블에 삽입하는 방법을 보여 줍니다. 먼저 TestTable1에서 원본 SQLXML 개체를 검색합니다. 그런 다음 Connection 클래스의 createSQLXML 메서드를 사용하여 빈 목적지 SQLXML 개체를 만듭니다. 다음으로 목적지 SQLXML 개체를 업데이트하고 TestTable2에 XML 데이터를 씁니다. 마지막으로 샘플 코드는 결과 집합에 있는 데이터 행을 통해 반복하며 getSQLXML 메서드를 사용하여 TestTable2의 XML 데이터를 읽습니다.

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 an 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 an 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 an 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);
    }
}

참고 항목

데이터 형식으로 작업(JDBC)