Oracle JDBC 21 驱动已彻底移除 XMLType 类,必须改用标准 JDBC 方式处理 XML 数据:优先用 getString() 获取字符串,或 getSQLXML() 获取标准 SQLXML 对象,也可用 TO_CLOB() 转为 CLOB 流式读取。
Oracle JDBC 21 驱动里 XMLType 已被弃用,别再用它了
oracle jdbc 21(即 ojdbc21)正式移除了 xmltype 类——它在 ojdbc11 中已标记为 @deprecated,到 ojdbc21 直接从 jar 中删除。如果你的代码还在 import oracle.xdb.xmltype 或调用 xmltype.createxml(...),编译会直接失败,报 cannot find symbol。
官方明确推荐迁移到标准 JDBC 方式处理 XML 数据:把 XMLType 字段当作 String、InputStream 或 SQLXML 处理。这不是权宜之计,而是 Oracle 当前和未来版本的唯一支持路径。
用 ResultSet.getString() 最简单,但要注意字符集与空值
大多数场景下,XML 内容是合法 UTF-8 文本,且字段不为空,直接用 getString() 最快也最稳:
String xmlStr = rs.getString("xml_col");
常见坑:
-
getString()在 Oracle 中默认按数据库字符集解码(如 AL32UTF8),但如果 JDBC URL 没显式指定characterEncoding=UTF-8,而应用层又用了非 UTF-8 的String处理逻辑(比如写入文件时用new FileWriter(...)默认平台编码),可能乱码 -
XMLType字段为 NULL 时,getString()返回null,不是空字符串,判空要写xmlStr == null,别用"".equals(xmlStr) - 如果 XML 内容超长(> 4000 字符),某些旧版驱动可能截断;
ojdbc21无此限制,但需确认字段实际是XMLTYPE STORE AS CLOB(推荐),而非STORE AS BINARY(后者不支持直接 getString)
需要 DOM/SAX 解析?用 ResultSet.getSQLXML() + 标准 API
getSQLXML() 是 JDBC 4.1+ 标准接口,ojdbc21 完全支持,返回的是标准 java.sql.SQLXML 实例,可安全转成 InputStream 或 Source:
SQLXML sqlXml = rs.getSQLXML("xml_col");
if (sqlXml != null) {
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(sqlXml.getBinaryStream()); // 或 .getCharacterStream()
}
关键点:
-
getBinaryStream()和getCharacterStream()二选一:前者更通用(避免字符集二次转换),后者更直观(返回 Reader) -
SQLXML对象必须在ResultSet有效期内使用;调用完记得sqlXml.free()(虽不强制,但防止底层资源泄漏) - 不要试图把
SQLXML强转成 Oracle 私有类(如oracle.sql.XMLType)——ojdbc21里这类型已不存在,强转会 ClassCastException
批量读取或性能敏感?绕过 XMLType,用 TO_CLOB() 显式转
如果表里 XML 数据量大、解析频率高,或者你发现 getSQLXML() 偶尔卡顿(尤其跨网络时),可以改用 SQL 层预转换:
SELECT id, TO_CLOB(xml_col) AS xml_clob FROM my_table
这样 JDBC 层就完全当它是普通 CLOB 字段处理,用 getClob() + getCharacterStream() 流式读取,内存友好且稳定:
Clob clob = rs.getClob("xml_clob");
try (Reader reader = clob.getCharacterStream()) {
// 用 StAX 或 SAX 逐段解析,不加载全文到内存
}
注意:
-
TO_CLOB(xml_col)要求xml_col确实是XMLTYPE字段,否则 ORA-00932 报错 - 该函数在 Oracle 11gR2+ 支持,10g 不行;若用老库,只能退回到
getString()或升级驱动+数据库 - 别用
TO_CHAR(xml_col)—— 它可能截断、丢失格式,且对含特殊字符的 XML 不安全
真正麻烦的从来不是“怎么拿到 XML 字符串”,而是 XML 本身结构不规范、编码声明混乱、或嵌套了 CDATA/实体引用。这些跟 JDBC 驱动无关,但容易让人误以为是 XMLType 迁移导致的问题——先用 getString() 打印原始内容,确认是不是 XML 本身就坏了,再查解析逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











