exemple de type de données SQLXML
Cet exemple d’application du Pilote JDBC Microsoft pour SQL Server montre comment stocker des données XML dans une base de données relationnelle, récupérer des données XML à partir d’une base de données et analyser des données XML avec le type de données Java SQLXML.
Les exemples de code de cette section utilisent un analyseur SAX (Simple API for XML). La norme SAX est une norme développée de manière publique pour l'analyse de documents XML en fonction des événements. Elle fournit également une interface de programmation d'applications pour l'utilisation des données XML. Les applications peuvent également utiliser d'autres analyseurs XML, par exemple DOM (Document Object Model), StAX (Streaming API for XML), etc.
DOM (Document Object Model) fournit une représentation par programme des documents, fragments, nœuds ou éléments node-set XML. Elle fournit également une interface de programmation d'applications pour l'utilisation des données XML. De même, StAX (Streaming API for XML) est une API Java pour l'analyse par extraction du code XML.
Important
Pour pouvoir utiliser l'API de l'analyseur SAX, vous devez importer l'implémentation SAX standard à partir du package javax.xml.
Le fichier de code de cet exemple, SqlXmlDataType.java, se trouve à l’emplacement suivant :
\<installation directory>\sqljdbc_<version>\<language>\samples\datatypes
Configuration requise
Pour exécuter cet exemple d'application, vous devez définir l'instruction classpath de façon à inclure le fichier sqljdbc4.jar. Si l'instruction classpath n'a pas d'entrée pour sqljdbc4.jar, l'exemple d'application lève l'exception « Classe introuvable ». Pour plus d’informations sur la façon de définir l’instruction classpath, consultez à l’aide du pilote JDBC.
Pour exécuter cet exemple d’application, vous aurez également besoin d’accéder à l’exemple de base de données AdventureWorks2022.
Exemple
Dans l’exemple suivant, le code établit une connexion à la base de données AdventureWorks2022, puis appelle la méthode createSampleTables.
La méthode createSampleTables supprime les tables de test TestTable1 et TestTable2, si elles existent. Elle insère ensuite deux lignes dans TestTable1.
En outre, l'exemple de code ajoute les trois méthodes décrites ci-après et une autre classe dont le nom est ExampleContentHandler.
La classe ExampleContentHandler implémente un gestionnaire de contenu personnalisé qui définit les méthodes pour les événements de l'analyseur.
La méthode showGetters montre comment analyser les données de l’objet SQLXML avec l’analyseur SAX, ContentHandler et XMLReader. En premier lieu, l'exemple de code crée une instance d'un gestionnaire de contenu personnalisé dont le nom est ExampleContentHandler. Ensuite, il crée et exécute une instruction SQL qui retourne un jeu de données à partir de TestTable1. L'exemple de code obtient ensuite un analyseur SAX pour analyser les données XML.
La méthode showSetters montre comment définir la colonne xml avec l’analyseur SAX, ContentHandler et ResultSet. Elle crée tout d’abord un objet SQLXML vide avec la méthode createSQLXML de la classe Connection. Elle obtient ensuite une instance d'un gestionnaire de contenu pour écrire les données dans l'objet SQLXML. L'exemple de code écrit ensuite les données dans TestTable1. Pour finir, l’exemple de code boucle sur les lignes de données du jeu de résultats, et utilise la méthode getSQLXML pour lire les données XML.
La méthode showTransformer montre comment obtenir des données XML à partir d'une table pour les insérer dans une autre table à l'aide de l'analyseur SAX et du transformateur. En premier lieu, elle récupère l'objet SQLXML source à partir de TestTable1. Elle crée ensuite un objet SQLXML de destination vide avec la méthode createSQLXML de la classe Connection. Elle met ensuite à jour l'objet SQLXML de destination et écrit les données XML dans TestTable2. Pour finir, l’exemple de code boucle sur les lignes de données du jeu de résultats, et utilise la méthode getSQLXML pour lire les données XML de 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);
}
}