第二个灵魂 发表于 2015-1-18 11:38:39

JAVA网页编程之JDBC+Hibernate将Blob数据写进Oracle

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;另外一种完成办法,节俭内存
  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;
  buffer=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-21 11:49:41

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

再见西城 发表于 2015-1-24 15:16:08

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

第二个灵魂 发表于 2015-1-31 20:56:49

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

海妖 发表于 2015-2-3 17:08:11

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

柔情似水 发表于 2015-2-5 14:07:31

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

冷月葬花魂 发表于 2015-2-28 02:37:23

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

因胸联盟 发表于 2015-3-9 18:48:04

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

莫相离 发表于 2015-3-13 12:11:10

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

分手快乐 发表于 2015-3-17 00:10:20

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

莫相离 发表于 2015-3-21 23:40:37

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

小魔女 发表于 2015-4-1 12:09:47

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

飘飘悠悠 发表于 2015-4-8 08:48:14

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

乐观 发表于 2015-4-14 01:38:45

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

飘灵儿 发表于 2015-4-15 14:14:05

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

再现理想 发表于 2015-4-16 01:15:00

是一种使用者不需花费很多时间学习的语言

不帅 发表于 2015-4-19 06:51:56

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

老尸 发表于 2015-4-21 20:54:25

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

金色的骷髅 发表于 2015-6-5 13:18:17

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

深爱那片海 发表于 2015-6-20 00:42:04

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
页: [1]
查看完整版本: JAVA网页编程之JDBC+Hibernate将Blob数据写进Oracle