#java.sql.SQLXML
# 描述
java.sql.SQLXML接口用于操作XMLTYPE类型数据,实例可通过ResultSet.getSQLXML()、PreparedStatement.setSQLXML()、Connection.createSQLXML()获取。核心作用是:
- 作为Java与数据库XML列之间的“数据桥梁”,支持XML数据的读写。
- 提供多种方式(流、字符串、DOM解析)访问和修改XML数据。
- 避免直接使用字符串处理XML时的编码、格式问题,保证数据完整性。
详细接口说明请参考JDBC官方网站 (opens new window)。
# 方法
YashanDB JDBC驱动对SQLXML接口有如下方法:
| 方法 | 返回类型 |
|---|---|
| free() | void |
| getString() | String |
| setString(String value) | void |
| getBinaryStream() | InputStream |
| setBinaryStream() | OutputStream |
| getCharacterStream() | Reader |
| setCharacterStream() | Writer |
| getSource(Class<T> sourceClass) | <T extends Source> T |
| setResult(Class<T> resultClass) | <T extends Result> T |
# 示例
package quickstart;
import java.io.IOException;
import java.io.Reader;
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.util.Properties;
public class XMLQueryTool {
public static Connection getConnection()
throws SQLException, ClassNotFoundException {
String url = "jdbc:yasdb://192.168.1.2:1688/yasdb";
Properties info = new Properties();
info.setProperty("user", "username");
info.setProperty("password", "passwd");
Class.forName("com.yashandb.jdbc.Driver");
return DriverManager.getConnection(url, info);
}
// XML 查询工具
public void searchInXMLData(Connection conn, String searchTerm)
throws SQLException, IOException {
String sql = "SELECT id, xml_data FROM documents WHERE xml_data LIKE ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "%" + searchTerm + "%");
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
SQLXML sqlxml = rs.getSQLXML("xml_data");
// 读取XML内容
try (Reader reader = sqlxml.getCharacterStream()) {
char[] buffer = new char[1024];
StringBuilder content = new StringBuilder();
int charsRead;
while ((charsRead = reader.read(buffer)) != -1) {
content.append(buffer, 0, charsRead);
}
// 循环读取字符流数据
if (content.toString().contains(searchTerm)) {
System.out.println("Found in document ID: " + id);
}
}
sqlxml.free();
}
}
}
}
// 提取 XML 片段
public void extractXMLFragment(Connection conn, int docId, String xpath)
throws SQLException {
String sql = "SELECT xml_data FROM documents WHERE id = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, docId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
SQLXML sqlxml = rs.getSQLXML("xml_data");
String fullXML = sqlxml.getString();
// 注:JDBC本身不提供XPath支持,需要依赖额外第三方库
System.out.println("Full XML length: " + fullXML.length());
sqlxml.free();
}
}
}
}
public static void main(String[] args) {
try (Connection conn = getConnection()) {
SQLXML sqlxml = conn.createSQLXML();
sqlxml.setString("<root><name>regress</name></root>");
System.out.println("SQLXML object created");
sqlxml.free();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
正常情况下,程序输出如下:
SQLXML object created

