此 Microsoft JDBC Driver for SQL Server 示例应用程序说明如何在关系数据库中存储 XML 数据,如何从数据库中检索 XML 数据,以及如何使用 SQLXML Java 数据类型分析 XML 数据。
本部分中的代码示例使用 Simple API for XML (SAX) 分析器。 SAX 是一种公开制定的标准,用于对 XML 文档进行基于事件的分析。 它还提供了一个用于处理 XML 数据的应用程序编程接口。 应用程序也可以使用其他任何 XML 分析器,例如,文档对象模型 (DOM) 或 Streaming API for XML (StAX) 等。
文档对象模型 (DOM) 提供了 XML 文档、碎片、节点或节点集的编程表示形式。 它还提供了一个用于处理 XML 数据的应用程序编程接口。 同样,Streaming API for XML (StAX) 也是一个基于 Java 的 API,用于 XML 的拉式分析。
重要
为了使用 SAX 分析器 API,必须从 javax.xml 包导入标准的 SAX 实现。
此示例的代码文件名为 SqlXmlDataType.java,位于以下位置:
\<installation directory>\sqljdbc_<version>\<language>\samples\datatypes
要求
若要运行此示例应用程序,必须将 classpath 设置为包含 sqljdbc4.jar 文件。 如果 classpath 缺少 sqljdbc4.jar 项,示例应用程序将引发“找不到类”异常。 若要详细了解如何设置类路径,请参阅使用 JDBC 驱动程序。
还需要访问 AdventureWorks2022 示例数据库才能运行此示例应用程序。
示例
在下面的示例中,示例代码先建立与 AdventureWorks2022 数据库的连接,然后调用 createSampleTables 方法。
如果测试表、TestTable1 和 TestTable2 存在,createSampleTables 方法会将它们删除。 然后该方法会在 TestTable1 中插入两行。
此外,代码示例还包含以下三个方法和另外一个名为 ExampleContentHandler 的类。
ExampleContentHandler 类实现一个自定义内容处理程序,该处理程序定义用于处理分析器事件的方法。
showGetters 方法演示如何使用 SAX、ContentHandler 和 XMLReader 分析 SQLXML 对象中的数据。 首先,该代码示例会创建一个自定义内容处理程序的实例,即 ExampleContentHandler。 接下来,它会创建并执行一个 SQL 语句,该语句从 TestTable1 返回一组数据。 然后,代码示例获取 SAX 分析器并分析 XML 数据。
showSetters 方法演示如何使用 SAX、ContentHandler 和 ResultSet 设置 xml 列。 首先,它使用 Connection 类的 createSQLXML 方法创建一个空的 SQLXML 对象。 然后,获取内容处理程序的一个实例以便向 SQLXML 对象中写入数据。 接下来,代码示例向 TestTable1 中写入数据。 最后,示例代码循环访问结果集中的数据行,并使用 getSQLXML 方法读取 XML 数据。
showTransformer 方法演示如何使用 SAX 和转换器从一个表中获取 XML 数据,然后将该 XML 数据插入另一个表中。 首先,从 TestTable1 中检索源 SQLXML 对象。 然后,使用 Connection 类的 createSQLXML 方法创建一个空的目标 SQLXML 对象。 接下来,更新目标 SQLXML 对象,并将 XML 数据写入 TestTable2。 最后,示例代码将循环访问结果集中的数据行,并使用 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 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);
}
}