在论坛上看到的一个问题,其实我从来没有用过Clob,因为确实没这个需求,但是为了抢分,如何最快的找到解决方案呢,第一时间想到spring,因为spring对orm工具有封装, 像ibatis,hibernate等,在spring.jar中大概翻了一下包,根据包名和类名发现如下可疑类org.springframework.orm.ibatis.support.ClobStringTypeHandler 根据源码跟踪到了 org.springframework.jdbc.support.lob.OracleLobHandler 这个类才是内有乾坤,有我想要的一切东西,嘿嘿,不好意思了,统统抄来.
在spring包中有个org.springframework.jdbc.support.lob.AbstractLobHandler这里面定义了基本的Clob和Blog处理方法
org.springframework.jdbc.support.lob.DefaultLobHandler是默认的实现,除了Oracle其他数据库使用此实现
org.springframework.jdbc.support.lob.OracleLobHandler是专门用于Oracle的实现,可见Oracle的BT,为了不造成直接包依赖,相关的调用都是利用反射完成的.有兴趣的朋友可以去阅读下这两个类,以便了解Oracle的特殊性.
经过分析,将Clob的创建,以及与String的互转代码放出来供大家使用.当然不可能完全copy了,我做了些简化处理,不过已经测试了,没用问题.更多细节请查阅spring的org.springframework.jdbc.support.lob包源码.
来源:(http://blog.sina.com.cn/s/blog_5109612b0100aq6l.html) - Oracle中的Clob与String类型转换_镭射头_新浪博客
SqlUtil类是我为了方便测试写的,大家靠代码就能够猜出来其内容了,所以就不全贴了,只贴本文的主题部分.
public static Object createOracleLob(Connection conn, String lobClassName)
throws Exception {
Class lobClass = conn.getClass().getClassLoader().loadClass(
lobClassName);
final Integer DURATION_SESSION = new Integer(lobClass.getField(
"DURATION_SESSION").getInt(null));
final Integer MODE_READWRITE = new Integer(lobClass.getField(
"MODE_READWRITE").getInt(null));
Method createTemporary = lobClass.getMethod("createTemporary",
new Class[] { Connection.class, boolean.class, int.class });
Object lob = createTemporary.invoke(null, new Object[] { conn, false,
DURATION_SESSION });
Method open = lobClass.getMethod("open", new Class[] { int.class });
open.invoke(lob, new Object[] { MODE_READWRITE });
return lob;
}
public static String oracleClob2Str(Clob clob) throws Exception {
return (clob != null ? clob.getSubString(1, (int) clob.length()) : null);
}
public static Clob oracleStr2Clob(String str, Clob lob) throws Exception {
Method methodToInvoke = lob.getClass().getMethod(
"getCharacterOutputStream", (Class[]) null);
Writer writer = (Writer) methodToInvoke.invoke(lob, (Object[]) null);
writer.write(str);
writer.close();
return lob;
}
public static void main(String[] args) throws Exception {
//创建数据源略
Connection conn = SqlUtil.getConnection();
Clob clob = (Clob) createOracleLob(conn, "oracle.sql.CLOB");// BLOB的话传oracle.sql.BLOB
// create table testTb (TheClob Clob);
PreparedStatement pstmt = conn
.prepareStatement("insert into testTb (TheClob) values (?)");
pstmt.setClob(1, oracleStr2Clob("test", clob));
pstmt.execute();
SqlUtil.closeStmt(pstmt);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from testTb");
while (rs.next()) {
String str = oracleClob2Str(rs.getClob(1));
System.out.println(str);
}
SqlUtil.closeRs(rs);
SqlUtil.closeStmt(stmt);
SqlUtil.closeConn(conn);
}
分享到:
相关推荐
### ORACLE中CLOB字段转String类型 在Oracle数据库中,`CLOB`(Character Large Object)是一种用于存储大量文本数据的数据类型。由于其能够存储非常大的文本块(最大可达4GB),因此常被用于存储文章、报告或任何...
在使用 WebLogic 服务器进行应用程序开发时,尤其是在处理 Oracle 数据库中的 CLOB 类型数据时,开发者可能会遇到类型转换的问题。本文将详细介绍如何通过反射机制来解决 WebLogic 环境下 Oracle CLOB 类型转换成 `...
在Java编程中,为了能够有效地与Oracle数据库中的CLOB类型交互,Java提供了`java.sql.Clob`类作为接口。 **1. CLOB的读取方法** - **getCharacterStream()**:返回一个`java.io.Reader`对象,按照Unicode编码读取...
标题中的“jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标”涉及到三个主要的Java数据库编程知识点:JDBC连接、Oracle数据库中的CLOB类型处理以及通过Java调用存储过程处理输出游标。 1. JDBC...
在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...
下面是一个具体的例子,展示如何将字符串转化为CLOB类型,并插入到Oracle数据库中: ```csharp using System.Data; using Oracle.ManagedDataAccess.Client; public bool InsertTsbhInfo(string strTB, string ...
在Oracle 10g中,CLOB数据类型的处理有时会遇到一些挑战,尤其是在与ORM框架结合使用时。以下将详细介绍相关知识点: 1. **CLOB类型**:CLOB是一种非二进制大对象,用于存储大量字符数据,最大可达到4GB。Oracle 10...
在Java编程中,Oracle的CLOB(Character Large Object)数据类型用于存储大量字符数据,如文本文件、HTML文档等。本教程将介绍如何使用Java来读取和写入Oracle数据库中的CLOB字段。 首先,我们需要引入相关的Java和...
2. **读取CLOB数据**:在查询返回结果中,iBATIS会自动处理CLOB类型,将其转化为String。但是,由于CLOB可能包含大量数据,因此在处理时需要考虑性能问题,避免一次性加载整个CLOB到内存中。 3. **事务管理**:由于...
5. **类型处理器**:iBATIS提供了一个`OracleClobHandler`,它可以自动处理CLOB到String的转换。确保在SqlMapConfig.xml中配置好这个处理器: ```xml ``` 6. **性能优化**:处理CLOB数据时,注意避免一次性...
在Java应用程序与Oracle数据库交互时,通常需要在两者之间进行`String`与CLOB类型的转换。以下是对这个主题的详细讨论。 1. **CLOB数据类型**: Oracle的CLOB类型可以存储最大为4GB的单个字符数据,这使得它成为...
在实际应用中,还可能涉及CLOB字段的写入操作,这通常可以通过`PreparedStatement`的`setClob()`方法实现,将String转换为`Clob`对象(可以使用`OracleConnection`的`createClob()`方法创建)后再设置到SQL语句中。...
为了简化处理,可以将Clob中的数据转换为String,利用Hibernate的String类型映射。在写入时,先将字符串转换为Clob对象,再由Hibernate处理;读取时,将Clob内容转化为字符串。这种方式适用于数据量不是特别大的...
Oracle 中的 CLOB 类型可以对应 DB2 的 CLOB 类型,用于存储大型字符数据。 Oracle 中的 NCLOB 类型可以对应 DB2 的 DBCLOB 类型,用于存储 Unicode 字符数据。 五、ROWID 类型 Oracle 中的 ROWID 类型可以对应 ...
同时,还需要注意数据的格式化和转换,以确保与Oracle数据库的兼容性。 例如: ```csharp OracleCommand cmd = new OracleCommand("INSERT INTO MyTable (MyNumber, MyDate, MyVarChar2) VALUES (:num, :dt, :str)...
在Java编程中,调用Oracle数据库的存储过程并传递CLOB(Character Large Object)类型参数是一项常见的任务。CLOB类型用于存储大文本数据,如XML文档、长篇报告或者日志记录。以下是一个详细的步骤解释如何实现这个...
在数据库编程领域,CLOB(Character Large Object)和BLOB(Binary Large Object)是用于存储大量文本和二进制数据的数据类型。在DELPHI中,处理这些大型对象时需要特殊的技术和策略。本篇文章将深入探讨DELPHI中...
Hibernate存储Clob字段的方式总结涉及了在Java开发中...在实际开发中,可以根据需求选择使用String直接映射Clob的方式或者使用Clob类型处理方式,并注意Hibernate session的创建和管理方法,以保证代码的简洁性与效率。
在IT领域,尤其是在数据库操作与数据管理中,CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,常用于保存如文章、报告、注释等大文本信息。本文将详细解析CLOB的读写问题,包括其在Oracle...
Java 存取 Oracle 中的 CLOB 类型数据 Java 存取 Oracle 中的 CLOB 类型数据是 Java 开发中的一项重要任务。CLOB(Character Large OBject)是一种大型字符对象,用于存储大型文本数据,最大可存储 4GB 数据。在 ...