`

java操作Oracle类型XMLType

阅读更多

java操作Oracle类型XMLType总结一:使用jdbc

java操作Oracle类型XMLType总结二:使用Mybatis

对于XMLType类型的使用,本人也是第一次,因为它不是一个通用的数据库类型,因此在使用过程中碰到诸多问题,在这里作一下总结,以备忘。

先来了解一下什么是XMLType类型。

XMLType是Oracle从9i开始特有的数据类型,是一个继承了Blob的强大存在,可以用来存储xml并提供了相当多的操作函数。理论上可以保存2G大小的数据。

那怎么样通过java来插入XMLType类型的数据呢?项目当中采用的是Mybatis,总是出现莫名的异常,都搞不清楚到底是Mybatis的问题还是jdbc本身的问题,所以打算一步步来,先搞定jdbc,再解决Mybatis。在折腾了半天之后,发现jdbc操作主要有3种方法:

一、在Java中把XMLType当作字符串String来用,具体创建XMLType的任务完全交给数据库:
1
2
3
4
String sql = "insert into xmltable (XML) values(sys.xmlType.createXML(?))";  
String xmldata = "<label>This is an XML fragment</label>";  
ps.setString(1, xmldata);  
ps.executeUpdate();

此方法会使数据库的压力偏大,因为此方法简单又不需要额外的依赖,在一开始采用此方法,但在实际使用过程中发现,在内容的长度超过4000左右的时候,会抛出:ORA-01461: can bind a LONG value only for insert into a LONG column 异常。一开始以为使用mybatis的原因,使用jdbc测试依然如此,使用诸多方法尝试无解。在项目中使用该大字段不可能只保存长度在4000以内的数据,这样使用varchar2足矣,所以该方法淘汰。

二、使用CLOB类型来操作。XMLType是继承了CLOB的存在,所以是可以通过CLOB来操作的。方法是在客户端创建好CLOB数据后传入数据库通过Oracle的XMLTYPE()函数来构造XMLType的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String sql = "insert into xmltable (XML) values(XMLType(?))";  
String xmldata = "<label>This is an XML fragment</label>"; 
//通过conn创建CLOB
CLOB tempClob = CLOB.createTemporary(connection, false, CLOB.DURATION_SESSION);
//打开CLOB
tempClob.open(CLOB.MODE_READWRITE);
//获得writer
Writer clobWriter = tempClob.setCharacterStream(100);
//写入数据
clobWriter.write(xmldata);
//刷新
clobWriter.flush();
//关闭writer
clobWriter.close();
//关闭CLOB
tempClob.close();
 
pst.setObject(1, tempClob);

此方法客户端和数据库同时承担了创建XMLType的任务,因此压力较平均,也没有超过长度的问题。但是在实际使用过程中又发现,xml的内容头部不能包含以下信息:

<?xml version="1.0" encoding="UTF-8"?>

否则会抛出异常:PI names starting with XML are reserved

先不说少了这个在以后处理xml内容包含中文时会不会遇到蛋疼的乱码问题,光是看着就让人感觉不爽,且需求上也要求保存,没办法,这个方法又行不通了。

三、使用Oracle提供的oracle.xdb.XMLType类,客户端创建XMLType后直接把对象传给数据库:
1
2
3
4
5
6
7
8
9
Connection conn = ... ;//获得Connection  
PreparedStatement ps = ...;//获得PreparedSatement  
String sql = "insert into xmltable (XML) values(?)";  
String xmldata = "<label>This is an XML fragment</label>";  
//创建一个XMLType对象  
XMLType xmltype = XMLType.createXML(conn, xmldata);  
 
ps.setObject(1, xmltype);  
ps.executeUpdate();

此方法将创建XMLType的任务完全交给了客户端,因此客户端的压力大,数据库压力小。在实测过程中,需要添加两个jar包,不然会报找不到类的错误:

xdb.jar

xmlparserv2.jar

需要注意这jar包又没版本标注,很容易弄错,一开始我下载了个xdb.jar,怎么弄都不对提示找不到某个类,查看之后发现是属于oracle更早期版本,重新下载了一个xdb.jar后正常。

以上三种方法通过插入20万条数据测试比较发现:

第一种方法:耗时最短,服务器cpu消耗最大

第二种方法:耗时最长,服务器cpu消耗居中

第三种方法:耗时居中,服务器cpu消耗最小

 

至此,jdbc操作XMLType类型数据终于算是小小的搞定了,不用说采用了第三种方案,但是项目中基本都不会直接用jdbc来操作,像当前项目中就采用了Mybatis,上面也讲到了使用Mybatis总是出现异常,查看了下Mybatis也没有对XMLType的实现,看来还有的折腾,不过jdbc已经搞定,思路已经清晰了不是?

分享到:
评论

相关推荐

    java中xml文件的处理及oracle中xmltype的插入和读取.pdf

    在 Oracle 数据库中,XMLType 是一种特殊的数据类型,用于存储和处理 XML 数据。在本文中,我们将详细介绍 Java 中 XML 文件的处理及 Oracle 中 XMLType 的插入和读取。 一、Oracle 中创建表 在 Oracle 数据库中,...

    java中xml文件的处理及oracle中xmltype的插入和读取.docx

    Oracle 中的 XMLType 是一种特殊的数据类型,用来存储 XML 数据。在 Oracle 中,我们可以使用 XMLType 列来存储 XML 数据,并使用 Oracle 的 XML 解析器来解析 XML 数据。 要将 XML 数据插入到 Oracle 数据库中的 ...

    xmltype需要jar包

    标题提到的"xmltype需要jar包",实际上指的是在Java应用程序中与Oracle数据库交互,特别是涉及到XMLType操作时,需要引入两个关键的JAR文件:xdb6.jar和xmlparserv2.jar。 **xdb6.jar**: 这个JAR文件包含了Oracle ...

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据

    在Java开发中,当需要与Oracle数据库交互时,特别是涉及到XML数据的存储,XMLType是Oracle提供的一种专门用于存储XML格式数据的类型。本文将详细探讨如何使用Java的JDBC和MyBatis框架来处理Oracle中的XMLType数据。 ...

    oracle12 jdbc驱动包

    Oracle 12c JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。在Java编程环境中,JDBC(Java Database Connectivity)是标准API,用于连接各种类型的...

    ORACLE操作XML函数

    在Oracle数据库中,`XMLTYPE`是一种专门用于存储XML数据的数据类型。通过使用`XMLTYPE`字段,可以有效地管理和查询XML文档。其中,`XPath_string`是用于指定在XML文档中查找或操作节点的路径表达式。 - **XMLTYPE_...

    v512工作室_张利国_Java高端培训系列教材_Oracle实用教程_04章_Oracle数据类型和函数.

    ### Oracle 数据类型详解 #### 4.1 Oracle 数据类型 ##### 4.1.1 概述 在深入了解Oracle数据库中的各种数据类型之前,我们首先需要明确数据类型的基本概念。数据类型是由一组具有相同特性的值及其上定义的操作...

    oracle数据库各版本驱动

    2. **ojdbc6**: 对应于Java 6,这个版本的驱动进一步优化了性能,并增加了对Oracle Advanced Queuing (AQ)、XMLType等特性的支持。ojdbc6同样是一款 thin driver,它支持JDBC 4.0规范,提供了一些新的API,如...

    Oracle 9i、10g、11g通用jdbc驱动包

    - Oracle 11g进一步增强了性能,支持分区数据库、XMLType等新数据类型,同时提供了更丰富的事务控制和错误处理机制。 6. 安全性: - JDBC驱动支持SSL加密,以保护数据库连接的安全。 - 通过JAAS进行身份验证和...

    Oracle_Xml.rar_Oracle XML _oracle_xml oracle_xml数据库_操作 xml

    在提供的“Oracle_Xml.java”文件中,很可能是Java程序示例,展示了如何在Oracle数据库中进行XML操作。可能包含创建XMLType对象、插入XML数据、查询XML数据以及使用XQuery或XSLT进行转换的代码片段。而...

    oracle驱动ojdbc678oracle11g

    Oracle JDBC驱动提供了多种类型的驱动,包括 Thin、OCI、JDBC-ODBC Bridge 和 Native Protocol 驱动,其中ojdbc6对应的是Thin驱动,这是一种纯Java实现,无需Oracle客户端软件即可运行,适用于跨平台的分布式环境。...

    Oracle XML DB

    在用户创建和权限设置完成后,就可以开始使用Oracle XML DB来操作XML数据了。这包括: - **创建XML表**:使用SQL命令创建专门用于存储XML数据的表,这些表可能包含XMLType列,用于存储XML文档。 - **插入XML文件...

    在Oracle XML DB中存储XML

    - **XMLType** 是Oracle XML DB中的核心数据类型,用于在数据库中存储XML文档。 - 这种数据类型使得XML文档能够以原生的格式存储,并利用数据库的关系特性进行高效的管理。 - **特点**: - **性能与扩展性**: ...

    Oracle 11g全新特性完全解析XML成为热点

    此外,Oracle 11g支持JSR 170,即Java内容存储仓库API,增强了XML与PL/SQL的交互能力。新引入的simple_integer数据类型提供了非空且更快的整数处理,而虚拟列(Virtual Columns)功能让用户可以基于业务需求动态定义...

    xdb6.jar、xmlparserv2.jar

    这里我们关注的是两个特定的JAR文件:“xdb6.jar”和“xmlparserv2.jar”,它们与Oracle数据库中的XMLType类型处理以及JDBC(Java Database Connectivity)操作紧密相关。这两个库在处理XML数据存储和检索时扮演着...

    ojdbc8.jar orai18n.jar xdb6.jar xdb.jar xmlparserv2.jar

    这里提到的"ojdbc8.jar orai18n.jar xdb6.jar xdb.jar xmlparserv2.jar"是一组关键的Oracle JDBC驱动和XML处理库,它们在Java程序中处理Oracle数据库特别是XMLType类型的数据时至关重要。 首先,`ojdbc8.jar`是...

    Oracle XML DB应用开发Oracle Database 11g

    其次,Oracle XML DB提供了XMLType数据类型,这是Oracle Database 11g中处理XML数据的核心。XMLType可以将XML文档视为数据库中的一个字段,支持XML文档的索引、查询、更新和删除操作。通过使用XMLType,开发者可以...

    Clinet端工具连接Oracle数据库的jar

    在Java应用中,xdb6.jar允许开发者利用Oracle数据库的XML特性,如XMLType数据类型和XMLDB存储方案。 在开发过程中,如果需要在客户端应用程序中连接Oracle数据库,可以将这些jar文件添加到项目的类路径中。这样,...

    oracle11g-ojdbc6

    Oracle JDBC驱动程序允许Java应用程序与Oracle数据库进行通信,执行SQL语句,处理结果集,以及进行各种数据库操作。在本篇文章中,我们将深入探讨Oracle JDBC驱动、OJDBC6的特点以及如何在Java应用中使用它。 首先...

Global site tag (gtag.js) - Google Analytics