﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-jemeli---java</title><link>http://www.blogjava.net/jemeli/</link><description>open code</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 03:54:47 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 03:54:47 GMT</pubDate><ttl>60</ttl><item><title>Hibernate存取图片示例 </title><link>http://www.blogjava.net/jemeli/archive/2007/02/07/98560.html</link><dc:creator>jemeli</dc:creator><author>jemeli</author><pubDate>Wed, 07 Feb 2007 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/jemeli/archive/2007/02/07/98560.html</guid><wfw:comment>http://www.blogjava.net/jemeli/comments/98560.html</wfw:comment><comments>http://www.blogjava.net/jemeli/archive/2007/02/07/98560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jemeli/comments/commentRss/98560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jemeli/services/trackbacks/98560.html</trackback:ping><description><![CDATA[
		<p>一般网站在处理用户上传图片时通常采用两种策略：一是直接把图片存入数据库中的Blob字段；二是数据库中只存储图片的在服务器上的路径信息 ，图片存放在分门别类的文件中，使用的时候从数据库读取路径信息到页面img元素即可．在此不讨论两种方案的优劣，我只是写了个hibernate的例子来实现第一种策略．例子很简单，t_user表主要两个字段，name和photo，其中photo字段类型为Blob．在此例中数据库我采用mysql， oracle的Blob字段比较特殊，你必须自定义类型，具体的请自行搜索，这方面的资料很多．</p>
		<p>//User.java　　</p>
		<p>package com.denny_blue.hibernate;</p>
		<p>import java.io.Serializable;<br />import java.sql.Blob;</p>
		<p>public class User implements Serializable{<br /> private Integer id;<br /> private String name;<br /> private Blob photo;<br /> /**<br />  * @return the id<br />  */<br /> public User(){<br /> }<br /> public Integer getId() {<br />  return id;<br /> }<br /> /**<br />  * @param id the id to set<br />  */<br /> public void setId(Integer id) {<br />  this.id = id;<br /> }<br /> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }<br /> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }<br /> /**<br />  * @return the photo<br />  */<br /> public Blob getPhoto() {<br />  return photo;<br /> }<br /> /**<br />  * @param photo the photo to set<br />  */<br /> public void setPhoto(Blob photo) {<br />  this.photo = photo;<br /> }<br /> <br />}<br /></p>
		<p>类User有３个属性，id,name,photo，相应的getter和setter方法以及一个无参构造函数．应该注意的是photo的类型java.sql.Blob</p>
		<p>相应的user.hbm.xml应该如下：</p>
		<p>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br /> "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br /> "<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>"&gt;<br />&lt;hibernate-mapping<br /> package="com.denny_blue.hibernate"&gt;</p>
		<p> &lt;class name="com.denny_blue.hibernate.User"<br />        table="t_user"<br />        dynamic-update="true"<br />        dynamic-insert="true"<br />        batch-size="3"&gt;<br />  &lt;id name="id"<br />      column="id"<br />      type="java.lang.Integer"&gt;<br />   &lt;generator class="native"/&gt;<br />  &lt;/id&gt;<br />  &lt;property name="name" column="name" type="java.lang.String" lazy="true"/&gt;<br />  &lt;property name="photo" column="photo" type="java.sql.Blob"/&gt;</p>
		<p> &lt;/class&gt;</p>
		<p>&lt;/hibernate-mapping&gt;</p>
		<p>对应的hibernate.cfg.xml配置文件，不再列出，请参照hibernate文档自行设定．</p>
		<p>ＯＫ，做了这一步，我们写个测试类来进行单元测试：</p>
		<p>package com.denny_blue.test;</p>
		<p>import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.sql.Blob;</p>
		<p>import org.hibernate.Hibernate;<br />import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.Transaction;<br />import org.hibernate.cfg.Configuration;</p>
		<p>import com.denny_blue.hibernate.User;</p>
		<p>import junit.framework.TestCase;</p>
		<p>public class HibernateTest extends TestCase {<br />        private Session session;<br /> protected void setUp() throws Exception {<br />  try{<br />   Configuration config=new Configuration().configure();<br />   SessionFactory sf=config.buildSessionFactory();<br />   session=sf.openSession();<br />  }catch(HibernateException e){<br />   e.printStackTrace();<br />  }<br /> }</p>
		<p> protected void tearDown() throws Exception {<br />  try{<br />   session.close();<br />  }catch(HibernateException e){<br />   e.printStackTrace();<br />  }<br /> }<br /> <br /> public void testSave()throws FileNotFoundException,IOException{<br />  User user=new User();<br />  user.setName("jordan");<br />  FileInputStream in=new FileInputStream("C://test.gif");<br />  Blob photo=Hibernate.createBlob(in);<br />  user.setPhoto(photo);<br />  Transaction tx=null;<br />  try{<br />  tx=session.beginTransaction();<br />  session.saveOrUpdate(user);<br />  tx.commit();<br />  }catch(HibernateException e){<br />   if(tx!=null)<br />    tx.rollback();<br />   e.printStackTrace();<br />  }finally{<br />   in.close();<br />  }<br /> }<br /> public void testLoad()throws Exception{<br />  try{<br />   User user=(User)session.load(User.class, new Integer(1));<br />   Blob photo=user.getPhoto();<br />   InputStream in=photo.getBinaryStream();<br />   FileOutputStream out=new FileOutputStream("C://out//test2.gif");<br />   byte [] buf=new byte[1024];<br />   int len;<br />   while((len=in.read(buf))!=-1){<br />    out.write(buf, 0, len);<br />   }<br />   in.close();<br />   out.close();<br />  }catch(HibernateException e){<br />   e.printStackTrace();<br />  }<br /> }</p>
		<p>}<br />我们读取C盘目录下的test.gif并存储到数据库中，然后再取出来写入C:/out目录，此时你可以查看下数据表中photo显示为blob,表示已经成功存入．值的注意的代码片段就是：</p>
		<p>FileInputStream in=new FileInputStream("C://test.gif");<br />  Blob photo=Hibernate.createBlob(in);<br />我们这里是从磁盘中读取图片，实际应用中你可以利用上传组件得到图片的２进制数据流，并利用Hibernate.createBlob方法来构造相应的Blob对象．而取图片则使用</p>
		<p>InputStream in=photo.getBinaryStream();</p>
		<p>这只是个简单的测试类，如果我想从数据库中取出图片并现实在页面上该如何做呢？其实也很简单，我们先要写一个servlet，在它的service方法中取出图片，并＂画＂到指定页面上．</p>
		<p>package com.easyjf.asp.action;</p>
		<p>import java.io.InputStream;<br />import java.io.OutputStream;<br />import java.sql.Blob;</p>
		<p>import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
		<p>import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.SessionFactory;<br />import org.hibernate.cfg.Configuration;<br />import com.denny)blue.hibernate.User;</p>
		<p>
				<br />public class Test extends HttpServlet {</p>
		<p> /**<br />  * Destruction of the servlet. &lt;br&gt;<br />  */<br /> private Session session;<br /> public void destroy() {<br />  try{<br />   session.close();<br />  }catch(HibernateException e){<br />   e.printStackTrace();<br />  }<br /> }</p>
		<p> /**<br />  * Initialization of the servlet. &lt;br&gt;<br />  *<br />  * @throws ServletException if an error occure<br />  */<br /> public void init() throws ServletException {<br />  try{<br />   Configuration config=new Configuration().configure();<br />   SessionFactory sf=config.buildSessionFactory();<br />   session=sf.openSession();<br />  }catch(HibernateException e){<br />   e.printStackTrace();<br />  }<br /> }<br />    public void doGet(HttpServletRequest request,HttpServletResponse response)<br />    {<br />     try{<br />   User user=(User)session.load(User.class, new Integer(1));<br />   Blob photo=user.getPhoto();<br />   InputStream in=photo.getBinaryStream();<br />   OutputStream out=response.getOutputStream();<br />   byte [] buf=new byte[1024];<br />   int len;<br />   while((len=in.read(buf))!=-1){<br />    out.write(buf, 0, len);<br />   }<br />   in.close();<br />   out.close();<br />  }catch(Exception e){<br />   e.printStackTrace();<br />  }<br />    }</p>
		<p>}</p>
		<p>通过response.getOutputStream取得输出流，其他就与上段代码一致．servlet写好了，怎么在页面调用呢？那就更简单啦，直接在页面的img标签的src属性上调用该servlet即可，如：</p>
		<p>&lt;img id="test" src="/servlet/Test"/&gt;</p>
		<p> </p>
		<p>简单的例子，希望对初学者有帮助．</p>
		<p>附记:如果不希望在servlet(或者action之类)中进行保存操作,希望在DAO进行此操作,那么InputStream的关闭问题可以通过hibernate的interceptor机制解决</p>
<img src ="http://www.blogjava.net/jemeli/aggbug/98560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jemeli/" target="_blank">jemeli</a> 2007-02-07 12:31 <a href="http://www.blogjava.net/jemeli/archive/2007/02/07/98560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>