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工具的整合。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 是一种使用者不需花费很多时间学习的语言 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
页:
[1]