- 浏览: 250034 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
no_studio:
期待实现SqlServer
发布异种数据库导入工具jmyetl-1.0.2 -
babydeed:
不错 再接再厉
发布异种数据库导入工具jmyetl-1.0.2 -
iihero:
niwtsew 写道贴个俺自己写的linux下的版本,其实没必 ...
命令行快速找出class文件所在的jar包 -
niwtsew:
说错,是strings不是string
命令行快速找出class文件所在的jar包 -
niwtsew:
贴个俺自己写的linux下的版本,其实没必要用7z,直接jar ...
命令行快速找出class文件所在的jar包
设有表:
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类型。这将在后边陆续进行介绍。
发表评论
-
发布异种数据库导入工具jmyetl-1.0.2
2012-06-11 05:14 1671利用空闲时间,折腾了一个,界面不太擅长,比较简陋,但是相信大家 ... -
各种数据库临时表的使用区别总结
2012-05-24 08:22 2388[size=large]虽然SQL92, 99, 2003, ... -
Oracle11.2.0非安装版(简装版)制作完成(仅供开发人员参考使用)
2012-03-11 13:57 1736作者: iihero@CSDN, 2012.3.11. 请尊重 ... -
常用的数据库连接串(JDBC篇)
2011-12-23 06:58 0看到网上传来传去的jdbc url连接串总结,好多都是粘来粘去 ... -
DBCP连接池的最简单应用(用于ORACLE数据库)
2011-11-19 05:54 4390鉴于有人问起DBCP直接用于JDBC连接的问题,我做了一个最简 ... -
Oracle的几位创始人
2011-11-04 00:31 1761Oracle共有三位创始人。 1. Larry Ellison ... -
DBeaver数据库管理工具连接Sybase数据库使用体验
2011-09-26 20:12 7201从http://dbeaver.jkiss.org/下 ... -
OCI几个小问题
2011-04-26 10:23 17021、CLOG/BLOG的插入 找了很多OCI的例子以及一些P ... -
关于Oracle中的rownum两个使用原则
2005-12-07 10:49 847rownum 只能< 不能>rownum 是在排序 ... -
突破Oracle for win2k的2G内存限制
2005-12-10 23:54 924....众所周知,在32位的操作系统如win2K上,操作系统能 ... -
访问Oracle Spatial中的SDO_GEOMETRY字段的方法(windows下)
2005-12-10 23:57 27221.使用oci或者occi,在安装oracle后可以在orac ... -
WindowsNT/2000/XP中的Oracle服务简介
2005-12-12 20:19 886这里以9.0.1为例,对9.2以及10g都有效。 注:SID ... -
Oracle服务启动的问题
2005-12-12 20:32 876软件环境: 操作系统:Windows 2000 Advanc ... -
使用 ADO.NET 和 Oracle 进行高级数据访问
2005-12-15 20:47 1197使用 ADO.NET 和 Oracle 进行高级数据访问 [ ... -
Oracle9i中OCCI在VC6下不能DEBUG的问题及解决方法
2006-08-20 17:13 949前段时间,在csdn论坛上 ... -
看了看几个数据库厂商的发展历史
2006-08-20 18:01 1063这两天把Oracle以及DB2、Sybase、SQL Serv ... -
关于Oracle数据库中的undo回滚段
2006-09-25 22:50 1005Oracle数据库当中,关于日志与回滚那一部分,与别的数据库确 ... -
使用exp/imp传输表空间(Oracle)
2006-09-25 22:52 975有时候,可以使用exp将 ... -
Oracle中SCN的理解
2006-09-25 22:54 740系统检查点scn(v$database(c ... -
如何在Oracle中使用Java存储过程 (详解)
2008-03-05 12:46 773其实,这篇短文,我早就应该写了。因为,java存储过程今后在各 ...
相关推荐
JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等对象 实例详细JDBC中操作Blob、Clob等...
JDBC中操作Blob、Clob等对象
oracle中的Blob和Clob区别,希望对大家学习有帮助呵
oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。
JDBC读写Oracle的CLOB字段
oracle Blob转换Clob
weblogic下转换oracle 的clob类型经常报转型错误,本例子通过反射解决weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB转型成oracle.sql.CLOB问题
Oracle导出Clob,Blob等大字段工具,自己写的工具,方便大家下载使用
spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。
oracle Blob Clob 大数处理 代码 文件上传 下载
BLOB和CLOB的区别以及在ORALCE中的插入和查询操作
简单写的一个小工具,把图片存入oracle中,按clob和blob两种方式存储,并读取图片
前两个例子的Demo 博文链接:https://zhangguanzhong.iteye.com/blog/623489
UTL_RAW.CAST_TO_VARCHAR2
jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc ...
Mybatis 处理 CLOB、BLOB 类型数据
NULL 博文链接:https://shihuan830619.iteye.com/blog/1662937
clob和blob在jdbc的应用~~~~~~
使用Hibernate映射Blob,Clob字段,并对这些字段完成存,取功能