|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
JAVA学习必须明确这是一项投资,对于大多数的人来说,学习JAVA是为了就业,还有就是刚走向工作位置的朋友想尽快赶上工作的节奏。oracle|数据Oracle的Blob字段对照特别,他比long字段的功能要好良多,能够用来保留比方图片之类的二进制数据。
写进Blob字段和写进别的范例字段的体例十分分歧,由于Blob本身有一个cursor,你必需利用cursor对blob举行操纵,因此你在写进Blob之前,必需取得cursor才干举行写进,那末怎样取得Blob的cursor呢?
这必要你先拔出一个empty的blob,这将创立一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,如许经由过程两步操纵,你就取得了blob的cursor,能够真实的写进blob数据了。
看上面的JDBC的demo,把oraclejdbc.jar这个二进制文件写进数据库表javatest的content字段(这是一个blob型字段)
importjava.sql.*;
importjava.io.*;
importoracle.sql.*;
publicclassWriteBlob{
publicstaticvoidmain(String[]args){
try{
DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver());
Connectionconn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");
conn.setAutoCommit(false);
BLOBblob=null;
PreparedStatementpstmt=conn.prepareStatement("insertintojavatest(name,content)values(?,empty_blob())");
pstmt.setString(1,"fankai");
pstmt.executeUpdate();
pstmt.close();
pstmt=conn.prepareStatement("selectcontentfromjavatestwherename=?forupdate");
pstmt.setString(1,"fankai");
ResultSetrset=pstmt.executeQuery();
if(rset.next())blob=(BLOB)rset.getBlob(1);
StringfileName="oraclejdbc.jar";
Filef=newFile(fileName);
FileInputStreamfin=newFileInputStream(f);
System.out.println("filesize="+fin.available());
pstmt=conn.prepareStatement("updatejavatestsetcontent=?wherename=?");
OutputStreamout=blob.getBinaryOutputStream();
intcount=-1,total=0;
byte[]data=newbyte[(int)fin.available()];
fin.read(data);
out.write(data);
/*
byte[]data=newbyte[blob.getBufferSize()];另外一种完成办法,节俭内存
while((count=fin.read(data))!=-1){
total+=count;
out.write(data,0,count);
}
*/
fin.close();
out.close();
pstmt.setBlob(1,blob);
pstmt.setString(2,"fankai");
pstmt.executeUpdate();
pstmt.close();
conn.commit();
conn.close();
}catch(SQLExceptione){
System.err.println(e.getMessage());
e.printStackTrace();
}catch(IOExceptione){
System.err.println(e.getMessage());
}
}
}
细心看上例,分三步:
1、拔出空blob
intojavatest(name,content)values(?,empty_blob());
2、取得blob的cursor
selectcontentfromjavatestwherename=?forupdate;
注重!!!必需加forupdate,这将锁定该行,直至该行被修正终了,包管不发生并发抵触。
3、updatejavatestsetcontent=?wherename=
用cursor往数据库写数据
这内里另有一点要提示人人:
JDK1.3带的JDBC2.0标准是不完美的,只要读Blob的接口,而没有写Blob的接口,JDK1.4带的JDBC3.0到场了写Blob的接口。你可使用JDBC3.0的接口,也能够间接利用Oracle的JDBC的API,我在上例中利用了Oracle的JDBC的API。
别的要注重的是:
java.sql.Blob
oracle.sql.BLOB
注重看blob的巨细写,是纷歧样的。写程序的时分不要弄混了。
上面看看用Hibernate怎样写,道理是一样的,也要分三步,可是代码复杂良多
这是Cat对象界说
packagecom.fankai;
importjava.sql.Blob;
publicclassCat{
privateStringid;
privateStringname;
privatecharsex;
privatefloatweight;
privateBlobimage;
publicCat(){}
publicStringgetId(){returnid;}
publicvoidsetId(Stringid){this.id=id;}
publicStringgetName(){returnname;}
publicvoidsetName(Stringname){this.name=name;}
publicchargetSex(){returnsex;}
publicvoidsetSex(charsex){this.sex=sex;}
publicfloatgetWeight(){returnweight;}
publicvoidsetWeight(floatweight){this.weight=weight;}
publicBlobgetImage(){returnimage;}
publicvoidsetImage(Blobimage){this.image=image;}
}
这是Cat.hbm.xml
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingSYSTEM"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<classname="com.fankai.Cat"table="cat">
<!--jcs-cacheusage="read-only"/-->
<idname="id"unsaved-value="null">
<generatorclass="uuid.hex"/>
</id>
<propertyname="name"length="16"not-null="true"/>
<propertyname="sex"length="1"not-null="true"/>
<propertyname="weight"/>
<propertyname="image"/>
</class>
</hibernate-mapping>
上面是完全的用Hibernate写进Blob的例子,比拟JDBC,已复杂轻松多了,也不必写那些Oracle特别的sql了:
packagecom.fankai;
importjava.sql.Blob;
importnet.sf.hibernate.*;
importoracle.sql.*;
importjava.io.*;
publicclassTestCatHibernate{
publicstaticvoidtestBlob(){
Sessions=null;
byte[]buffer=newbyte[1];
buffer[0]=1;
try{
SessionFactorysf=HibernateSessionFactory.getSessionFactory();
s=sf.openSession();
Transactiontx=s.beginTransaction();
Catc=newCat();
c.setName("Robbin");
c.setImage(Hibernate.createBlob(buffer));
s.save(c);
s.flush();
s.refresh(c,LockMode.UPGRADE);
BLOBblob=(BLOB)c.getImage();
OutputStreamout=blob.getBinaryOutputStream();
StringfileName="oraclejdbc.jar";
Filef=newFile(fileName);
FileInputStreamfin=newFileInputStream(f);
intcount=-1,total=0;
byte[]data=newbyte[(int)fin.available()];
fin.read(data);
out.write(data);
fin.close();
out.close();
s.flush();
tx.commit();
}catch(Exceptione){
System.out.println(e.getMessage());
}finally{
if(s!=null)
try{
s.close();
}catch(Exceptione){}
}
}
}
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,netBeans等等,但是我认为如果java想超越.net,那么他首先要解决的就是IDE工具的整合。 |
|