首页 > 其他分享 >用JDBC操纵BLOB和CLOB数据

用JDBC操纵BLOB和CLOB数据

时间:2022-11-21 20:05:26浏览次数:55  
标签:... JDBC String CLOB rs stmt BLOB sql blob

在访问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;
    }

 

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

 

标签:...,JDBC,String,CLOB,rs,stmt,BLOB,sql,blob
From: https://blog.51cto.com/u_15887056/5875166

相关文章

  • JDBC知识
    1jdbc是什么?JavaDateBaseconnectivity,java数据库连接,java语言连接数据库JDBC本质:sun公司定义了一套操作所有关系型数据库的规则(接口),各个数据库厂商去实现这套数据库,提......
  • Java_JDBC
    JDBC一、JDBC简介1、概念:​ JDBC就是使用Java语言操作关系型数据库的一套API​ 全称:(JavaDataBaseConnectivity)Java数据库连接2、本质:为了使得Java代码可以......
  • python多进程map用户 scatter绘图 make_blobs聚类数据生成
    pythonmultiprocessingmap(func,iterable[,chunksize])map()内置函数的并行等价物(尽管它只支持一个可迭代的参数)。它会阻塞,直到结果准备就绪。此方法将iterable内的每一个......
  • JDBC回顾
    JDBC什么是JDBC:Java连接数据库!需要jar包的支持:java.sqljavax.sqlmysql-conneter-java...连接驱动(必须要导入)实验环境搭建CREATETABLEusers(idINT......
  • 001. SpringIoc 和 SpingAop 、SpringJdbc
         ......
  • JDBC核心技术
    第1章:JDBC概述1.1数据的持久化持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存......
  • js Blob 与 ArrayBuffer
    1/*2*Blob3*4*Blob(BinaryLargeObject)表示二进制类型的大对象,在数据库管理系统中,将二进制数据存储为一个单一个体的集合5*Blob通常是影像、......
  • ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB/ORA-01460: 转换请求无法实施或不
    最近公司软件中某功能在使用时报错了:ORA-00932:数据类型不一致:应为-,但却获得CLOB看了一下SQL如下:SELECTDISTINCTCLOB字段FROM(SELECTCLOB字段FROM......
  • JDBC学习笔记
    JDBC学习笔记一.前阶段0.0前章HTMLCSSJS负责结构,表现,行为服务端Tomcat有关的XML语言(可拓展性),可以自定义标签,用于写配置文件的服务器Tomcat的组件Servlet......
  • js blob与base64互转、以及file和base64的相互转换
    file和base641.file文件转换为base64,得到base64格式图片varreader=newFileReader();reader.readAsDataURL(this.files[0]);reader.onload=function(){cons......