`

使用JDBC操作基于Oracle的CLOB,BLOB字段类型

阅读更多
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qq772708707.blog.51cto.com/259758/79253
先来看看两种LOB类型的主要区别:
CLOB 表示Character LOB (字符LOB)  它可以存储大量的字符数据。
BLOB表示 Binary LOB(二进制LOB)。此数据类型的列可以存储大型二进制对象,如图形、视频剪辑和声音文件等。

基本上我们可以得出这样的结论: 文本文件我们既可以使用BLOB也可以使用CLOB,二进制文件的存储我们只能使用BLOB类型.

好,下面通过代码示例描述如何读取和写入LOB类型的字段:
1. 先建一张表,具有三个字段:
CREATE TABLE "ATTACHMENT" (
"ID" VARCHAR2(10) NOT NULL,
"MYCLOB" CLOB,
"MYBLOB" BLOB,
PRIMARY KEY("ID"));

2. 准备两个文件用来存入数据库:
c:/Test.java  用来代表文本文件
C:/xx.jar  用来代表二进制数据

3. 存储文本信息到CLOB字段中
    Connection conn = DBUtil.getConnection();
    conn.setAutoCommit(false);
    Statement stmt = conn.createStatement();
        //先初始化CLOB字段,此处为必须的操作,否则后面会产生空指针异常
    String initSql = "UPDATE ATTACHMENT SET MYCLOB=EMPTY_CLOB() WHERE ID=1";
        //读取CLOB字段
    String updateSql = "SELECT MYCLOB FROM ATTACHMENT WHERE ID=1";
    stmt.executeUpdate(initSql);
    ResultSet rs = stmt.executeQuery(updateSql);
    if (rs.next()) {
        CLOB clob = (CLOB) rs.getClob(1); //获取CLOB字段内容并转换为 oracle.sql.CLOB类型
                //获取CLOB的输出流
        Writer os = clob.getCharacterOutputStream();
                //读取文本文件
        BufferedReader br = new BufferedReader(new FileReader(new File(
                "c:/Test.java")));
        String line = br.readLine();
        StringBuffer buffer = new StringBuffer();
        while (line != null) {
            buffer.append(line);  
            line = br.readLine();
        }
        os.write(buffer.toString());
        os.flush();
        br.close();
        os.close();
        conn.commit();
        conn.close();
    }
    System.out.println("Saved");
   在SQLPlus中测试一下文件有没有存入到数据库中,
   SQL>
   SQL> SELECT DBMS_LOB.GETLENGTH(MYCLOB) FROM ATTACHMENT;
显示结果如下:
DBMS_LOB.GETLENGTH(MYCLOB)
--------------------------
                       177
这表明文件已经写入到这个MYCLOB字段中,如果没有存入的话,SQLPlus中不会显示任何数字(包括零也不会被显示), 现在可以进行下一步操作了
  
4. 读取CLOB字段中的文本信息
    Connection conn = DBUtil.getConnection();
    Statement st = conn.createStatement();
    PreparedStatement preparedStatement = conn.prepareStatement("SELECT MYCLOB FROM ATTACHMENT WHERE ID=1");
    ResultSet rs = preparedStatement.executeQuery();
    if (rs.next()) {
                //获取CLOB字段信息
        CLOB clob = (CLOB)rs.getClob("MYCLOB");
        BufferedReader br = new BufferedReader(clob.getCharacterStream());
                //创建输出流
        BufferedWriter out = new BufferedWriter(new FileWriter("C:/tttt.txt"));
        String line = br.readLine();
        while (line != null) {
            out.write(line);
            System.out.println(line);
            line = br.readLine();
            out.flush();
        }
        out.close();
        br.close();
    }
    rs.close();
    st.close();
    conn.close();


5. 写入二进制信息到BLOB字段
    conn = DBUtil.getConnection();
    // 设置不自动提交
    conn.setAutoCommit(false);
    // 创建数据库操作语句
    statement = conn.createStatement();
    // 定义SQL语句
    statement.executeUpdate("UPDATE ATTACHMENT SET MYBLOB = EMPTY_BLOB() WHERE ID=1");
    String strSQL = "SELECT MYBLOB FROM ATTACHMENT WHERE ROWNUM = 1 FOR UPDATE";
    resultset = statement.executeQuery(strSQL);
    BLOB contents = null;
    while (resultset.next()) {
        // 取出BLOB对象
        contents = (oracle.sql.BLOB) resultset.getBlob(1);
    }
    OutputStream out = contents.getBinaryOutputStream();
    FileInputStream in = new FileInputStream(new File("c:/XX.jar"));
    //将输出流和输入流对转
    FileUtil.copy(in, out);
    out.close();
    in.close();
    // 数据库提交
    conn.commit();
    conn.close();
    同样,这里我们也在SQLPlus中测试一下BLOB字段中是否已经含有数据:
    SQL>
    SQL> SELECT DBMS_LOB.GETLENGTH(MYBLOB) FROM ATTACHMENT;
    显示结果如下:
    DBMS_LOB.GETLENGTH(MYBLOB)
    --------------------------
                           211
    表明已经存入数据,数据的大小是21.1k, 现在可以进行读取操作了

6. 读取BLOB字段中内容并存储到一个文件中
    Connection conn = DBUtil.getConnection();
    conn.setAutoCommit(false);
    PreparedStatement preparedStatement = conn
            .prepareStatement("SELECT DATA FROM ATTACH WHERE ROWNUM=1");
    ResultSet rs = preparedStatement.executeQuery();
    if (rs.next()) {
        Blob blob = rs.getBlob(1);
        if (blob != null) {
            InputStream is = ((BLOB) blob).getBinaryStream();
            // ((CLOB) clob).getCharaterStream();
            FileOutputStream fos = new FileOutputStream(new File(
                    "c:/abc.jar"));
            FileUtil.copy(is, fos);
            fos.close();
            is.close();
        }
    }
    rs.close();
    preparedStatement.close();
    conn.close();

        输出: c盘的根目录下应该出现了一个abc.jar 的文件, 你可以根据字节数和xx.jar比较一下,应该完全相同.
    上述步骤是使用了示例代码展示了如何操作Oracle中LOB字段类型,如果需要本文中的全部源代码请发送邮件到info@javabiz.cn

    如需转载请注明本文来自程式先锋网站 [url]http://www.javabiz.cn[/url]

本文出自 “程式先锋” 博客,请务必保留此出处http://qq772708707.blog.51cto.com/259758/79253

分享到:
评论

相关推荐

    jdbc读写Oracle的CLOB字段

    JDBC读写Oracle的CLOB字段

    oracle中使用jdbc读写clob和blob字段

    oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。

    关于oracle中clob字段查询慢的问题及解决方法

    最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了。 blob字段直接用 select * from table_name where column like ‘%%'查找的时候是不能实现...

    oracle中读写blob字段的问题解析

    下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。 先建立如下两个测试用的数据库表,Power Designer PD模型如下: 建表SQL语句为:CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)CREATE

    关于在Hibernate中对于Clob,Blob字段的处理方法

    oracle的jdbc驱动程序,用这个版本的操作Clob,blob类型的数据很方便。 博文链接:https://zhenjw.iteye.com/blog/173419

    jdbc批量插入大字段

    针对oracle中blob字段的操作,能批量快速的插入大字段,效率非常高

    ssh(structs,spring,hibernate)框架中的上传下载

     使用BlobByteArrayType字段类型后,为什么我们就可以象一般的字段类型一样操作Blob字段呢?可以确定的一点是:BlobByteArrayType不可能逾越Blob天生的操作方式,原来是BlobByteArrayType数据类型本身具体数据访问...

    DBKING使用指南

     3、统一的数据库操作类型。在dbking中,所有的数据库数据只有五种数据类型,String、Number(BigDecimal)、Timestamp、Clob(String)、Blob(byte[]),经过反复测试后,我们会例出各种数据库数据类型到这五种...

    Spring中文帮助文档

    处理BLOB 和 CLOB对象 11.7.3. 在IN语句中传入一组参数值 11.7.4. 处理复杂类型的存储过程调用 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring容器中创建 ...

    Spring API

    处理BLOB 和 CLOB对象 11.7.3. 在IN语句中传入一组参数值 11.7.4. 处理复杂类型的存储过程调用 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring容器中创建 ...

Global site tag (gtag.js) - Google Analytics