#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

pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流