仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1392|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之JDBC+Hibernate将Blob数据写进Oracle

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:38:39 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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工具的整合。
第二个灵魂 该用户已被删除
沙发
 楼主| 发表于 2015-1-31 20:56:49 来自手机 | 显示全部楼层
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-10 04:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表