Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
JDBC-stuurprogramma downloaden
Dit Microsoft JDBC-stuurprogramma voor sql Server-voorbeeldtoepassing laat zien hoe u XML-gegevens opslaat in een relationele database, hoe u XML-gegevens ophaalt uit een database en hoe u XML-gegevens kunt parseren met het SQLXML Java-gegevenstype.
In de codevoorbeelden in deze sectie wordt een Simple API voor XML-parser (SAX) gebruikt. De SAX is een openbaar ontwikkelde standaard voor het parseren van XML-documenten op basis van gebeurtenissen. Het biedt ook een programmeerinterface voor toepassingen voor het werken met XML-gegevens. Toepassingen kunnen ook andere XML-parser gebruiken, zoals het Document Object Model (DOM) of de Streaming-API voor XML (StAX), enzovoort.
Het Document Object Model (DOM) biedt een programmatische weergave van XML-documenten, fragmenten, knooppunten of knooppuntsets. Het biedt ook een programmeerinterface voor toepassingen voor het werken met XML-gegevens. Op dezelfde manier is de Streaming-API voor XML (StAX) een Op Java gebaseerde API voor het parseren van XML-pull-bestanden.
Belangrijk
Als u de SAX-parser-API wilt gebruiken, moet u de standaard SAX-implementatie importeren uit het javax.xml pakket.
Het codebestand voor dit voorbeeld heeft de naam SqlXmlDataType.java en kan worden gevonden op de volgende locatie:
\<installation directory>\sqljdbc_<version>\<language>\samples\datatypes
Requirements
Als u deze voorbeeldtoepassing wilt uitvoeren, moet u het klassepad instellen om het sqljdbc4.jar-bestand op te nemen. Als in het klassepad een vermelding voor sqljdbc4.jar ontbreekt, genereert de voorbeeldtoepassing de uitzondering 'Klasse niet gevonden'. Zie Het JDBC-stuurprogramma gebruiken voor meer informatie over het instellen van het klassepad.
U hebt ook toegang nodig tot de voorbeelddatabase AdventureWorks2025 om deze voorbeeldtoepassing uit te voeren.
Example
In het volgende voorbeeld maakt de voorbeeldcode een verbinding met de Database AdventureWorks2025 en roept de methode createSampleTables aan.
De methode createSampleTables verwijdert de testtabellen, TestTable1 en TestTable2, als deze bestaan. Vervolgens worden twee rijen ingevoegd in TestTable1.
Het codevoorbeeld bevat ook de volgende drie methoden en een andere klasse, met de naam ExampleContentHandler.
De klasse ExampleContentHandler implementeert een aangepaste inhoudshandler, waarmee methoden voor parser-gebeurtenissen worden gedefinieerd.
De showGetters-methode laat zien hoe u de gegevens in het SQLXML-object kunt parseren met behulp van sax, ContentHandler en XMLReader. Eerst maakt het codevoorbeeld een exemplaar van een aangepaste inhoudshandler, bijvoorbeeld ExampleContentHandler. Vervolgens wordt er een SQL-instructie gemaakt en uitgevoerd waarmee een set gegevens uit TestTable1 wordt geretourneerd. Vervolgens wordt in het codevoorbeeld een SAX-parser opgehaald en worden de XML-gegevens geparseerd.
De methode showSetters laat zien hoe u de XML-kolom instelt met behulp van de SAX-, ContentHandler- en ResultSet. Eerst wordt er een leeg SQLXML-object gemaakt met behulp van de createSQLXML-methode van de verbindingsklasse. Vervolgens wordt een instantie van een inhoudshandler verkregen om de gegevens naar het SQLXML-object te schrijven. Vervolgens schrijft het codevoorbeeld de gegevens naar TestTable1. Ten slotte doorloopt de voorbeeldcode de rijen met gegevens in de resultatenset en wordt de getSQLXML-methode gebruikt om de XML-gegevens te lezen.
De methode showTransformer laat zien hoe u XML-gegevens uit de ene tabel kunt ophalen en die XML-gegevens in een andere tabel kunt invoegen met behulp van SAX en de Transformer. Eerst wordt het bron-SQLXML-object opgehaald uit TestTable1. Vervolgens wordt een leeg SQLXML-doelobject gemaakt met behulp van de createSQLXML-methode van de verbindingsklasse. Vervolgens wordt het doel-SQLXML-object bijgewerkt en worden de XML-gegevens naar TestTable2 geschreven. Ten slotte doorloopt de voorbeeldcode de rijen met gegevens in de resultatenset en gebruikt de getSQLXML-methode om de XML-gegevens in TestTable2 te lezen.
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);
}
}