`
sundful
  • 浏览: 1253460 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用JDBC操纵BLOB和CLOB数据

阅读更多

在访问Oracle 数据库,对Oracle 的BLOB 和CLOB 进行操作的时候,当通过Oracle JDBC Driver 来调用的时,如下所例:

Driver myDriver = (Driver)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
conn = myDriver.connect("jdbc:oracle:thin:" , props);
Statement stmt = conn.createStatement();
stmt.execute("select blob_content from lobtest where id=1");
ResultSet rs = stmt.getResultSet();
System.out.println("ResultSet result:"+rs);
while ( rs.next() ) ...{
System.out.println("BLOB:"+rs.getBlob("blob_content"));
myBlob = (oracle.sql.BLOB)rs.getBlob("blob_content");
}

 

返回的数据对象正确,是oracle.sql.BLOB 对象,然后可以使用该对象进行方法访问。
但当使用Oracle JDBC Driver 配置连接池后,使用DataSource 取得数据库连接之后,查询CLOB 数据,赋值给oracle.sql.CLOB 的对象,这是就会报类型转换错误。

在网络上有相应的解决方案,但都是依赖于某一种应用服务器所提供的oracle连接环境。
下面是一个比较好的解决方案:
1。必须有支持jdbc3.0以上规范的oracle驱动。
2。更新blob字段数据

public void updateBlob(String tableName, String blobFeild, String pryKey, String pryKeyValue, byte[] blob)
            throws IOException, SQLException ...{
        Statement stmt = null;
        ResultSet rs = null;
        try ...{
            stmt = conn.createStatement();
            String sql = "UPDATE " + tableName + " SET " + blobFeild + "=EMPTY_BLOB() WHERE " + pryKey + "='"
                    + pryKeyValue + "'";
            // 如果参数blob为null,清空blob值;否则先清空blob值,然后插入新的blob值。
            if (blob == null) ...{
                stmt.executeUpdate(sql);
            } else ...{
                stmt.executeUpdate(sql);
                sql = "SELECT " + blobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue
                        + "' FOR UPDATE";
                rs = stmt.executeQuery(sql);
                if (rs.next()) ...{
                    Blob inBlob = rs.getBlob(blobFeild);
                    int len = inBlob.setBytes(1, blob);
                    log.debug("已成功保存BLOB大对象:" + len / 1024 + "KB");
                }
            }
        } finally ...{
            DbUtils.close(rs);
            DbUtils.close(stmt);
        }
    }

 

3。获取blob字段数据
   

public byte[] findBlob(String tableName, String blobFeild, String pryKey, String pryKeyValue) throws SQLException ...{
        byte[] blob = null;
        Statement stmt = null;
        String sql = "SELECT " + blobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue + "'";
        ResultSet rs = null;
        try ...{
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            if (rs.next()) ...{
                Blob outBlob = rs.getBlob(blobFeild);
                if (outBlob != null && outBlob.length() > 0) ...{
                    blob = outBlob.getBytes(1, (int) outBlob.length());
                }
            }
        } finally ...{
            DbUtils.close(rs);
            DbUtils.close(stmt);
        }
        return blob;
    }

 

4。更新clob字段数据
   

public void updateClob(String tableName, String clobFeild, String pryKey, String pryKeyValue, String clob)
            throws IOException, SQLException ...{
        Statement stmt = null;
        ResultSet rs = null;
        try ...{
            stmt = conn.createStatement();
            String sql = "UPDATE " + tableName + " SET " + clobFeild + "=EMPTY_CLOB() WHERE " + pryKey + "='"
                    + pryKeyValue + "'";
            // 如果参数clob为null,清空clob值;否则先清空clob值,然后插入新的clob值。
            if (clob == null) ...{
                stmt.executeUpdate(sql);
            } else ...{
                stmt.executeUpdate(sql);
                sql = "SELECT " + clobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue
                        + "' FOR UPDATE";
                rs = stmt.executeQuery(sql);
                if (rs.next()) ...{
                    Clob inClob = rs.getClob(clobFeild);
                    int len = inClob.setString(1, clob);
                    log.debug("已成功保存CLOB大对象:" + len / 1024 + "KB");
                }
            }
        } finally ...{
            DbUtils.close(rs);
            DbUtils.close(stmt);
        }
    }

 

5。获取clob字段数据
   

 public String findClob(String tableName, String clobFeild, String pryKey, String pryKeyValue) throws SQLException ...{
        String clob = "";
        Statement stmt = null;
        String sql = "SELECT " + clobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue + "'";
        ResultSet rs = null;
        try ...{
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            if (rs.next()) ...{
                Clob outClob = rs.getClob(clobFeild);
                if (outClob != null && outClob.length() > 0) ...{
                    clob = outClob.getSubString(1, pryKeyValue.length());
                }
            }
        } finally ...{
            DbUtils.close(rs);
            DbUtils.close(stmt);
        }
        return clob;
    }

 

采用以上这种方式可以避免对连接池提供方的依赖。

 

分享到:
评论

相关推荐

    利用Java程序实现Oracle数据库中大对象的存取.pdf

    随着硬件价格的下降和数据应用的增加,数据库逐渐成为所有数据的中心存储仓库。Oracle从8i中使用了LOB(大对象)这种特殊的数据类型,实现了对这些数据的存储。 LOB是以对象的形式出现的,不同于以往的普通数据结构...

    Java Database Programming Bible (2002)

    - **第3章:SQL基础** —— 介绍SQL语言的基础知识,包括数据定义语言(DDL)和数据操纵语言(DML)。 - **第4章:JDBC简介** —— 介绍Java数据库连接(JDBC)的概念及其在Java程序中访问数据库的作用。 2. **第二部分...

    通过JDBC连接oracle数据库的十大技巧

    - **LOB支持**:在处理大型文本或二进制数据时,Oracle的BLOB (Binary Large Object) 和 CLOB (Character Large Object) 类型非常有用。JDBC提供了一套API来处理这些数据类型,包括`setObject()`、`setBinaryStream...

    IBM认证的DB2 700的考题

    10. **应用程序开发接口**:熟悉DB2提供的各种应用程序接口,如JDBC、ODBC和.NET,以及如何使用这些接口进行数据库连接和数据操作。 通过深入学习以上知识点,并结合"700_exam"中的考题进行实践,你将更充分地准备...

    Oracle官方文档CHM合集-Database参考手册.rar

    文档会介绍如何配置这些特性,以保障数据库的连续性和数据完整性。 8. Oracle工具:Oracle提供了许多管理和开发工具,如SQL*Plus、Enterprise Manager、Developer Studio等。这些工具的使用方法和功能将在文档中...

    java 数据库编程

    - **高级数据类型**:如BLOB和CLOB等大型对象的支持。 - **元数据**:元数据是指关于数据的数据,例如表结构、列信息等。JDBC提供了获取这些元数据的方法。 #### 五、JDBC可选包 - **数据源**:数据源接口(`javax...

    直连SQL server数据库的三个压缩包

    它可能包含特定于SQL Server的函数和特性支持,例如对存储过程、事务管理、大型对象(如BLOB和CLOB)的支持,以及性能优化等。 3. msutil.jar:这个文件通常包含一些实用工具类,用于辅助数据库操作,如数据类型...

    oraclejdbc.rar_Java编程_Java_

    Oracle JDBC驱动提供了一组特定于Oracle的类和接口,如OracleConnection、OracleCallableStatement等,这些扩展了标准JDBC接口,以支持Oracle特有的功能,如存储过程、游标、BLOB/CLOB处理等。 MyEclipse作为IDE,...

    初级软件开发工程师考试大纲.pdf

    考生需理解JDBC基本概念和工作原理,能够优化设置FetchSize、Statement缓存和结果集缓存,熟练使用PreparedStatement和CallableStatement进行数据库操作,包括对Clob和Blob的支持。 最后,JSP技术要求考生能安装和...

    javaEE学习笔记

    - Blob 和 Clob 类型的支持。 - 元数据处理。 - **RowSet Implementation** - RowSet 的不同实现。 - 如何使用 JdbcRowSet 和 WebRowSet。 - **JDBC 和应用架构** - JDBC 在不同应用层中的作用。 - 与 EJB ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     11.3 操纵Blob和Clob类型数据  11.4 小结  11.5 思考题 第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  ...

    DM7SQL程序设计

    普通静态SQL语句包括数据操纵和数据查询。 ###### 5.1.1 数据操纵 数据操纵包括插入(`INSERT`)、更新(`UPDATE`)和删除(`DELETE`)。 ```sql INSERT INTO my_table (id, value) VALUES (1, 100); UPDATE my_table ...

Global site tag (gtag.js) - Google Analytics