Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理


设有表:
createtableblobimg(idintprimarykey,contentsblob);
一、BLOB入库的专用访问:
1)最常见于Oracle的JDBC示例中
一般是先通过select...forupdate锁定blob列,然后写入blob值,然后提交。要用到特定的OracleBLOB类。
Class.forName("oracle.jdbc.driver.OracleDriver");
Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb","test","test");
//处理事务
con.setAutoCommit(false);
Statementst=con.createStatement();
//插入一个空对象
st.executeUpdate("insertintoBLOBIMGvalues(1,empty_blob())");
//用forupdate方式锁定数据行
ResultSetrs=st.executeQuery(
"selectcontentsfromBLOBIMGwhereid=1forupdate");
if(rs.next()){
//使用oracle.sql.BLOB类,没办法了,变成专用的了
oracle.sql.BLOBblob=(oracle.sql.BLOB)rs.getBlob(1).;
//到数据库的输出流
OutputStreamoutStream=blob.getBinaryOutputStream();
//这里用一个文件模拟输入流
Filefile=newFile("d://proxy.txt");
InputStreamfin=newFileInputStream(file);
//将输入流写到输出流
byte[]b=newbyte[blob.getBufferSize()];
intlen=0;
while((len=fin.read(b))!=-1){
outStream.write(b,0,len);
}
//依次关闭
fin.close();
outStream.flush();
outStream.close();
}
con.commit();
con.close();

 2)再厉害一点的,是通过调用DBMS_LOB包中的一些函数来处理,效率好像也不错.
 不过,要使用到存储过程,用到专用类OracleCallableStatement。
 例:
importjava.sql.*;
importjava.io.*;
importoracle.jdbc.driver.*;
importoracle.sql.*;
classTestBlobWriteByDBMS_LOB{

publicstaticvoidmain(Stringargs[])throwsSQLException,
FileNotFoundException,IOException
{
DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
Connectionconn=
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora92","scott","tiger");
conn.setAutoCommit(false);
Statementstmt=conn.createStatement();
stmt.execute("deletefromdemo");
System.out.println("deletedfromdemo");
stmt.execute("insertintodemo(id,theBlob)values(s_enr.nextval,empty_blob())");
conn.commit();
System.out.println("committed");
ResultSetrset=stmt.executeQuery("SELECTtheBlobFROMdemowhereid=s_enr.currvalFORUPDATE");
System.out.println("ExecutedQuery");
if(rset.next())
{
System.out.println("Fetchedrow");
BLOBl_mapBLOB=((OracleResultSet)rset).getBLOB(1);
FilebinaryFile=newFile("e://free//jo.jpg");
FileInputStreaminstream=newFileInputStream(binaryFile);
intchunk=32000;

System.out.println("Chunk="+chunk);

byte[]l_buffer=newbyte[chunk];
intl_nread=0;

OracleCallableStatementcstmt=
(OracleCallableStatement)conn.prepareCall("begindbms_lob.writeappend(:1,:2,:3);end;");
cstmt.registerOutParameter(1,OracleTypes.BLOB);
while((l_nread=instream.read(l_buffer))!=-1)
{
cstmt.setBLOB(1,l_mapBLOB);
cstmt.setInt(2,l_nread);
cstmt.setBytes(3,l_buffer);
cstmt.executeUpdate();
l_mapBLOB=cstmt.getBLOB(1);
}
instream.close();
conn.commit();
rset.close();
stmt.close();
conn.close();
}
}
}
 

二、BLOB值读取的通用处理:
这个jdbc标准接口可以直接调用,因此比较简单,如下所示:
Connectioncon=ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statementst=con.createStatement();
ResultSetrs=st.executeQuery("selectcontentsfromBLOBIMGwhereid=1");
if(rs.next()){
java.sql.Blobblob=rs.getBlob(1);
InputStreamins=blob.getBinaryStream();
//输出到文件
Filefile=newFile("d://output.txt");
OutputStreamfout=newFileOutputStream(file);
//下面将BLOB数据写入文件
byte[]b=newbyte[1024];
intlen=0;
while((len=ins.read(b))!=-1){
fout.write(b,0,len);
}
//依次关闭
fout.close();
ins.close();
}
con.commit();
con.close();

三、BLOB值写入的通用处理:
 这时要借助于PreparedStatement的动态绑定功能,借用其setObject()方法插入字节流到BLOB字段。
publicvoidinsertFile(Filef)throwsException{
FileInputStreamfis=newFileInputStream(f,Connectionconn);
byte[]buffer=newbyte[1024];
data=null;
intsept=0;intlen=0;
while((sept=fis.read(buffer))!=-1){
if(data==null){
len=sept;
data=buffer;
}else{
byte[]temp;
inttempLength;
tempLength=len+sept;
temp=newbyte[tempLength];
System.arraycopy(data,0,temp,0,len);
System.arraycopy(buffer,0,temp,len,sept);
data=temp;
len=tempLength;
}
if(len!=data.length()){
bytetemp=newbyte[len];
System.arraycopy(data,0,temp,0,len);
data=temp;
}
}
Stringsql="insertintofileData(filename,blobData)value(?,?)";
PreparedStatementps=conn.prepareStatement(sql);
ps.setString(1,f.getName());
ps.setObject(2,data);
ps.executeUpdate();
}

四.CLOB读取的通用处理
publicstaticStringgetClobString(ResultSetrs,intcol){
try{
Clobc=resultSet.getClob(2);
Readerreader=c.getCharacterStream():
if(reader==null){
returnnull;
}
StringBuffersb=newStringBuffer();
char[]charbuf=newchar[4096];
for(inti=reader.read(charbuf);i>0;i=reader.read(charbuf)){
sb.append(charbuf,0,i);
}
returnsb.toString();
}catch(Exceptione){
return"";
}
}


当然还可以直接编写BLOB存取的存储过程供JDBC调用,那也非常方便。不过可能要用到外部LOB类型。这将在后边陆续进行介绍。

<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OracleBLOBCLOB都是用来存储大型二进制和字符数据的数据类型,但是它们之间有一些区别。 BLOB是二进制大型对象,用于存储二进制数据,例如图像、音频和视频等。BLOB数据可以通过二进制流进行读取和写入。 CLOB是字符大型对象,用于存储字符数据,例如文本和XML等。CLOB数据可以通过字符流进行读取和写入。 另外,BLOBCLOB在存储和检索时的处理方式也有所不同。BLOB数据可以使用OracleBLOB API进行处理,而CLOB数据可以使用OracleCLOB API进行处理。 ### 回答2: 在Oracle数据库BLOBCLOB都是用于存储大型二进制对象(LOB)的数据类型。但是,它们之间存在一些区别。 首先,BLOB(Binary Large Object)用于存储二进制数据,例如图像、音频和视频文件等。而CLOB(Character Large Object)用于存储字符数据,例如文本文档和HTML页面等。 其次,BLOB在存储时不会进行字符集转换,而CLOB则需要转换为数据库的字符集。这意味着当您插入或更新BLOB数据时,它将保持原样,而CLOB数据可能会因为字符集转换而发生变化。因此,在处理文本数据时应该使用CLOB,而在处理二进制数据时应该使用BLOB。 另外,BLOB可以存储二进制文件,并且是二进制安全的,这意味着它可以存储任意二进制数据。而CLOB只能存储字符数据,因此无法存储二进制文件。 最后,由于BLOBCLOB存储的数据量可能非常大,因此它们的操作方式也有所不同。通常情况下,您不应该使用SELECT *查询BLOBCLOB列,因为它们会返回非常大的数据块并导致性能问题。相反,您应该使用子选择语句或分段读取(chunking)等技术来处理LOB数据。 总之,在Oracle数据库BLOBCLOB是用于存储大型对象的非常有用的数据类型,但是要注意它们之间的差异并适当地使用它们以获得最佳性能和效果。 ### 回答3: Oracle数据库是一种关系型数据库管理系统。它支持许多数据类型以适应不同的场景,其包括BLOBCLOB类型。BLOBCLOB类型是两种不同的数据类型,它们在使用和存储方面有着一些不同之处。 BLOB是二进制大型对象(Binary Large Object)的缩写,存储的是二进制数据,例如图片、音乐、视频等等。它可以存储最大长度达到4GB的二进制数据。BLOB数据可以直接存储在数据库表,也可以被存储在文件系统。当需要操作BLOB数据时,可以使用内置的函数来读取、写入或更新数据。 CLOB是字符大型对象(Character Large Object)的缩写,存储的是文本数据,例如文章、邮件、代码等等。它可以存储最大长度达到4GB的文本数据。CLOB数据也可以直接存储在数据库表,但由于其大小通常比BLOB更大,因此它们也可以被存储在文件,而不是存储在表。当需要处理CLOB数据时,也可以使用内置的函数进行读取、写入或更新。 BLOBCLOB在使用方式上也有所不同。BLOB数据更适合用于媒体数据的存储和处理,例如图片、音乐、视频等。而CLOB数据则更适合用于文本数据的存储和处理,例如文章、邮件、代码等。通常来说,CLOBBLOB更易于处理和查询,因为它们是基于文本的数据类型,可以使用文本搜索和其他文本处理功能。 总之,在Oracle数据库BLOBCLOB是两种不同的数据类型,用途和存储方式也不同。BLOB用于存储二进制数据,例如图片、音乐、视频等;而CLOB用于存储文本数据,例如文章、邮件、代码等。了解它们之间的差异可以帮助你选择正确的数据类型,并更好地进行数据库管理和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值