`
cherryQQ
  • 浏览: 1136987 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

java String和Clob转换

    博客分类:
  • java
阅读更多


第一时间想到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包源码.

SqlUtil类是我为了方便测试写的,大家靠代码就能够猜出来其内容了,所以就不全贴了,只贴本文的主题部分.



    /**
     *
     * Description:创建Clob或者Blob
     *
     * @param conn数据库连接对象
     * @param lobClassName
     *            oracle.sql.CLOB或者oracle.sql.BLOB
     * @return oracle.sql.CLOB或者oracle.sql.BLOB对象
     * @throws Exception
     * @blog blog.csdn.ne t/sunyujia/
     * @mail sunyujia@yahoo.cn
     * @since:Oct 1, 2008 6:42:08 PM
     */
    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;
    }

    /**
     *
     * Description:将Clob对象转换为String对象,Blob处理方式与此相同
     *
     * @param clob
     * @return
     * @throws Exception
     * @mail sunyujia@yahoo.cn
     * @blog blog.csdn.ne t/sunyujia/
     * @since:Oct 1, 2008 7:19:57 PM
     */
    public static String oracleClob2Str(Clob clob) throws Exception {
        return (clob != null ? clob.getSubString(1, (int) clob.length()) : null);
    }

    /**
     *
     * Description:将string对象转换为Clob对象,Blob处理方式与此相同
     *
     * @param str
     * @param lob
     * @return
     * @throws Exception
     * @mail sunyujia@yahoo.cn
     * @blog blog.csdn.ne t/sunyujia/
     * @since:Oct 1, 2008 7:20:31 PM
     */
    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();
       &n-

bsp;return lob;
    }

    /**
     *
     * Description: 全部源码查考自
     * org.springframework.jdbc.support.lob.OracleLobHandler
     *
     * @param args
     * @throws Exception
     * @mail sunyujia@yahoo.cn
     * @blog blog.csdn.ne t/sunyujia/
     * @since:Oct 1, 2008 7:26:16 PM
     */
    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);
    }



分享到:
评论
1 楼 JianCaesar 2016-08-12  
oracleStr2Clob,为什么要用反射,直接调用不可以吗?

相关推荐

    mybatis 对clob类型转换

    在处理CLOB类型时,MyBatis需要将Java对象中的String或Reader类型数据转换为CLOB,以便存储到数据库中。 1. **CLOB类型数据的插入** 当你需要将一个字符串或者Reader对象插入到CLOB字段时,MyBatis默认可能无法...

    java读写oracle clob字段

    本教程将介绍如何使用Java来读取和写入Oracle数据库中的CLOB字段。 首先,我们需要引入相关的Java和Oracle JDBC驱动库。在上述代码中,我们看到`import oracle.jdbc.driver.OracleDriver;`,这表示我们将使用Oracle...

    java存储oracle中的clob类型

    ### Java存储Oracle中的CLOB类型知识点详解 #### 一、CLOB类型简介及Java操作方法 CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,在Oracle数据库中被广泛使用,可以支持最大4GB的数据量。...

    String_clob.zip_oracle

    在Java应用程序与Oracle数据库交互时,通常需要在两者之间进行`String`与CLOB类型的转换。以下是对这个主题的详细讨论。 1. **CLOB数据类型**: Oracle的CLOB类型可以存储最大为4GB的单个字符数据,这使得它成为...

    jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标

    标题中的“jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标”涉及到三个主要的Java数据库编程知识点:JDBC连接、Oracle数据库中的CLOB类型处理以及通过Java调用存储过程处理输出游标。 1. JDBC...

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    3. **CLOB 数据读取**:无论是 `oracle.sql.CLOB` 还是通过 `getVendorObj()` 方法得到的 `oracle.sql.CLOB` 对象,都可以通过 `getAsciiStream()` 和 `getSubString()` 方法来读取 CLOB 的内容,并将其转换为字符串...

    CLOB与BLOB

    CLOB与BLOB的存储与读取,String与CLOB的想换转换,字节码文件的存储与读取等等

    Hibernate存储Clob字段的方式总结

    首先,要操作数据库中的Clob字段,需要关注的是如何在Java对象与Clob字段之间进行转换。由于Clob字段通常用于存储大量文本数据,如果使用传统的JDBC方式处理,代码将会相当复杂。但随着数据库技术的发展,越来越多的...

    ActiveXObject和Clob字段的插入更新

    在IT领域,ActiveXObject和Clob字段是两个重要的概念,主要与Web开发和数据库操作相关。ActiveXObject是Microsoft的一种技术,允许在Internet Explorer浏览器中创建和使用COM对象,而Clob是数据库中用于存储大量字符...

    CLOB字段处理

    在 Java 中,通过使用 oracle.sql.CLOB 类来处理 CLOB 类型字段的存储和读取。 在 Java 中,连接 Oracle 数据库需要使用 Oracle 的 JDBC 驱动程序。首先,需要使用 Class.forName() 方法加载驱动程序,然后使用 ...

    hibernate保存blob,clob对象

    在上面的代码中,`SerialBlob`是JDBC API提供的一个类,用于将字节数组转化为Blob对象,而`StringClob`可能需要特定的库来实现,如Apache Commons Lang的`StringUtils.toClob()`方法。 在检索大型对象时,Hibernate...

    clob的保存和修改

    例如,在Oracle中,你可以创建一个包含CLOB列的表,然后使用`TO_CLOB`函数将字符串转换为CLOB类型进行插入。 ```sql CREATE TABLE my_table (id NUMBER, content CLOB); INSERT INTO my_table (id, content) ...

    关于Oracle的 Clob数据类型在Hibernate中的应用小结

    在Hibernate中,如果Clob字段的值是字符串,可以通过将Clob字段映射为String类型,让Hibernate自动处理转换。这种方式简单易用,但可能不适合非常大的文本,因为可能会导致内存溢出。 3.3 直接使用Clob类型: 对于...

    JDBC中操作Blob、Clob等对象

    在JDBC(Java Database Connectivity)编程中,Blob和Clob是非常重要的数据类型。Blob(Binary Large Object)主要用于存储二进制大对象,如图像、音频文件等;而Clob(Character Large Object)则用于存储大量的文本...

    clob 的读存问题

    在Oracle数据库中,通过正确使用CLOB对象和相关的数据库连接API,可以高效地进行CLOB数据的读取和写入。需要注意的是,由于CLOB数据量庞大,读取时应考虑性能优化,如分块读取等策略;写入时则需确保数据的完整性和...

    关于Clob类型在Hibernate中 的应用小结

    在Java世界中,尤其是在持久化框架Hibernate中,处理Clob类型的数据需要特别的方法和配置。 在Hibernate中,Clob类型的字段通常有两种处理方式: 1. **传统JDBC方式**: 在这种模式下,开发者需要直接操作Clob...

    java调用oracle含有clob参数的存储过程.docx

    在Java编程中,调用Oracle数据库的存储过程并传递CLOB(Character Large Object)类型参数是一项常见的任务。CLOB类型用于存储大文本数据,如XML文档、长篇报告或者日志记录。以下是一个详细的步骤解释如何实现这个...

    ibatis oracle clob

    2. **读取CLOB数据**:在查询返回结果中,iBATIS会自动处理CLOB类型,将其转化为String。但是,由于CLOB可能包含大量数据,因此在处理时需要考虑性能问题,避免一次性加载整个CLOB到内存中。 3. **事务管理**:由于...

    Hibernate对BLOB CLOB操作

    在Java的持久化框架Hibernate中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用来处理大数据类型的,如图像、音频、大型文本等。本文将深入探讨Hibernate如何进行BLOB和CLOB的操作,以及相关的...

    hibernate动态映射表处理oracle的clob类型

    - 使用Blob/Clob接口:直接操作Clob接口进行读写,而不是将其转换为字符串或其他数据类型,以减少转换开销。 通过以上内容,你应该对在Hibernate中动态映射Oracle 10g的CLOB类型有了深入理解,这将帮助你在实际...

Global site tag (gtag.js) - Google Analytics