`
MAYDAY_2014
  • 浏览: 6205 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

hibernate存取图片示例(转自我心飞扬的博客)

 
阅读更多
-------android培训、java培训、期待与您交流! ----------
一般网站在处理用户上传图片时通常采用两种策略:一是直接把图片存入数据库中的Blob字段;二是数据库中只存储图片的在服务器上的路径信息 ,图片存放在分门别类的文件中,使用的时候从数据库读取路径信息到页面img元素即可.在此不讨论两种方案的优劣,我只是写了个hibernate的例子来实现第一种策略.例子很简单,t_user表主要两个字段,name和photo,其中photo字段类型为Blob.在此例中数据库我采用mysql,oracle的Blob字段比较特殊,你必须自定义类型,具体的请自行搜索,这方面的资料很多.

//User.java  

package com.denny_blue.hibernate;

import java.io.Serializable;
import java.sql.Blob;

public class User implements Serializable{
private Integer id;
private String name;
private Blob photo;
/**
  * @return the id
  */
public User(){
}
public Integer getId() {
  return id;
}
/**
  * @param id the id to set
  */
public void setId(Integer id) {
  this.id = id;
}
/**
  * @return the name
  */
public String getName() {
  return name;
}
/**
  * @param name the name to set
  */
public void setName(String name) {
  this.name = name;
}
/**
  * @return the photo
  */
public Blob getPhoto() {
  return photo;
}
/**
  * @param photo the photo to set
  */
public void setPhoto(Blob photo) {
  this.photo = photo;
}

}


类User有3个属性,id,name,photo,相应的getter和setter方法以及一个无参构造函数.应该注意的是photo的类型java.sql.Blob

相应的user.hbm.xml应该如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="com.denny_blue.hibernate">

<class name="com.denny_blue.hibernate.User"
        table="t_user"
        dynamic-update="true"
        dynamic-insert="true"
        batch-size="3">
  <id name="id"
      column="id"
      type="java.lang.Integer">
   <generator class="native"/>
  </id>
  <property name="name" column="name" type="java.lang.String" lazy="true"/>
  <property name="photo" column="photo" type="java.sql.Blob"/>

</class>

</hibernate-mapping>

对应的hibernate.cfg.xml配置文件,不再列出,请参照hibernate文档自行设定.

OK,做了这一步,我们写个测试类来进行单元测试:

package com.denny_blue.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.denny_blue.hibernate.User;

import junit.framework.TestCase;

public class HibernateTest extends TestCase {
        private Session session;
protected void setUp() throws Exception {
  try{
   Configuration config=new Configuration().configure();
   SessionFactory sf=config.buildSessionFactory();
   session=sf.openSession();
  }catch(HibernateException e){
   e.printStackTrace();
  }
}

protected void tearDown() throws Exception {
  try{
   session.close();
  }catch(HibernateException e){
   e.printStackTrace();
  }
}

public void testSave()throws FileNotFoundException,IOException{
  User user=new User();
  user.setName("jordan");
  FileInputStream in=new FileInputStream("C:\\test.gif");
  Blob photo=Hibernate.createBlob(in);
  user.setPhoto(photo);
  Transaction tx=null;
  try{
  tx=session.beginTransaction();
  session.saveOrUpdate(user);
  tx.commit();
  }catch(HibernateException e){
   if(tx!=null)
    tx.rollback();
   e.printStackTrace();
  }finally{
   in.close();
  }
}
public void testLoad()throws Exception{
  try{
   User user=(User)session.load(User.class, new Integer(1));
   Blob photo=user.getPhoto();
   InputStream in=photo.getBinaryStream();
   FileOutputStream out=new FileOutputStream("C:\\out\\test2.gif");
   byte [] buf=new byte[1024];
   int len;
   while((len=in.read(buf))!=-1){
    out.write(buf, 0, len);
   }
   in.close();
   out.close();
  }catch(HibernateException e){
   e.printStackTrace();
  }
}

}
我们读取C盘目录下的test.gif并存储到数据库中,然后再取出来写入C:\out目录,此时你可以查看下数据表中photo显示为blob,表示已经成功存入.值的注意的代码片段就是:

FileInputStream in=new FileInputStream("C:\\test.gif");
  Blob photo=Hibernate.createBlob(in);
我们这里是从磁盘中读取图片,实际应用中你可以利用上传组件得到图片的2进制数据流,并利用Hibernate.createBlob方法来构造相应的Blob对象.而取图片则使用

InputStream in=photo.getBinaryStream();

这只是个简单的测试类,如果我想从数据库中取出图片并现实在页面上该如何做呢?其实也很简单,我们先要写一个servlet,在它的service方法中取出图片,并"画"到指定页面上.

package com.easyjf.asp.action;

import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.denny)blue.hibernate.User;


public class Test extends HttpServlet {

/**
  * Destruction of the servlet. <br>
  */
private Session session;
public void destroy() {
  try{
   session.close();
  }catch(HibernateException e){
   e.printStackTrace();
  }
}

/**
  * Initialization of the servlet. <br>
  *
  * @throws ServletException if an error occure
  */
public void init() throws ServletException {
  try{
   Configuration config=new Configuration().configure();
   SessionFactory sf=config.buildSessionFactory();
   session=sf.openSession();
  }catch(HibernateException e){
   e.printStackTrace();
  }
}
    public void doGet(HttpServletRequest request,HttpServletResponse response)
    {
     try{
   User user=(User)session.load(User.class, new Integer(1));
   Blob photo=user.getPhoto();
   InputStream in=photo.getBinaryStream();
   OutputStream out=response.getOutputStream();
   byte [] buf=new byte[1024];
   int len;
   while((len=in.read(buf))!=-1){
    out.write(buf, 0, len);
   }
   in.close();
   out.close();
  }catch(Exception e){
   e.printStackTrace();
  }
    }

}

通过response.getOutputStream取得输出流,其他就与上段代码一致.servlet写好了,怎么在页面调用呢?那就更简单啦,直接在页面的img标签的src属性上调用该servlet即可,如:

<img id="test" src="/servlet/Test"/>



非常感激我心飞扬大哥
原文地址:http://www.blogjava.net/parable-myth/archive/2006/10/28/77769.html
分享到:
评论

相关推荐

    Hibernate学习代码示例

    这个“Hibernate学习代码示例”压缩包文件为初学者提供了丰富的学习资源,帮助他们理解并掌握Hibernate的核心概念和实际应用。 首先,让我们详细探讨一下Hibernate的基础知识。Hibernate是一个开源的ORM框架,它的...

    hibernate完整小示例

    **hibernate完整小示例** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这个“hibernate完整小示例”旨在提供一个基础的指南,帮助开发者理解如何在实际项目中...

    Hibernate_使用示例代码

    这篇资源主要提供了关于Hibernate框架的实战应用示例,作者在iteye博客上分享了相关的代码实现。通过学习这些示例,开发者可以更好地理解和掌握如何在实际项目中运用Hibernate进行数据库操作。 **标签:“源码”,...

    hibernate存取oracle的clob

    hibernate存取oracle的clob

    spring mvc 与JPA/Hibernate的整合示例

    总之,这个示例将指导开发者如何将Spring MVC、JPA和Hibernate整合到同一个项目中,实现一个功能完善的Web应用,同时提供了一种组织和管理代码的方式。通过理解这些组件的协同工作,开发者可以更好地掌握Java Web...

    spring+hibernate整合简单示例

    在实际项目中,"spring+hibernate整合简单示例"可能包含以下内容:一个简单的Spring配置文件,定义了DataSource、SessionFactory、TransactionManager等bean;一个或多个DAO接口和其实现类,使用HibernateTemplate...

    Hibernate常用操作示例

    Hibernate常用操作示例,包含详细注释说明,数据库初始化文件。使用和学习请参考:http://blog.csdn.net/daijin888888/article/details/51692942

    hibernate存取汉字小程序

    【hibernate存取汉字小程序】是一个典型的Java开发项目,主要使用了Eclipse IDE、Hibernate3 ORM框架以及Oracle数据库来处理中文字符的问题。在实际的软件开发中,尤其是在与数据库交互时,处理中文字符可能会遇到...

    spring webwork hibernate结合登录示例

    本示例中,“Spring Webwork Hibernate结合登录示例”展示的是如何整合这三个框架来实现一个完整的用户登录功能。下面将详细解释这个示例中的关键知识点: 1. **Spring框架**:Spring的核心是依赖注入,它允许...

    Struts2 Hibernate存取Oracle数据库中的BLOB数据.pdf

    - BLOB(二进制大对象):用于存储大型二进制数据,如影像、图片等,其长度可达4GB,支持随机存取。 - BFILE:虽然用于存储大型二进制数据,但数据实际存储在文件系统中,数据库中仅存储指向文件的指针,Oracle对...

    Hibernate 完整项目示例

    **Hibernate 完整项目示例** 本项目是一个基于JavaWeb技术的完整实例,它深入运用了Hibernate框架,展示了如何在实际开发中利用Hibernate进行数据的持久化操作,包括数据的插入和查询。Hibernate是一个强大的对象...

    Hibernate示例

    在本示例中,我们将探讨如何使用 Hibernate 进行基本的数据存取操作。 **环境准备** 在开始 Hibernate 示例之前,我们需要确保以下组件已经准备就绪: 1. JDK:确保安装了 Java 开发环境,并设置好 `JAVA_HOME` ...

    Spring整合Hibernate示例

    Spring整合Hibernate配置测试示例

    spring2.5.6与hibernate3.3整合示例

    本示例展示了如何将Spring 2.5.6版本与Hibernate 3.3版本进行整合,以便在Java应用程序中实现高效的数据访问和事务管理。 Spring是一个全面的后端开发框架,提供诸如依赖注入(DI)、面向切面编程(AOP)以及声明式...

    maven+hibernate项目简单示例

    这个“maven+hibernate项目简单示例”旨在展示如何在Eclipse环境下集成这两个技术来创建一个基本的Java Web应用。 首先,让我们深入理解Maven。Maven是一个项目管理和综合工具,它通过读取项目配置文件(pom.xml)...

    hibernate-代码学习示例

    【hibernate-代码学习示例】是一个关于Hibernate框架的实战教程,主要针对开发者提供深入理解和使用Hibernate的实例。Hibernate是Java开发中的一个流行对象关系映射(ORM)框架,它简化了数据库操作,使开发者可以更...

    hibernate入门小示例

    **hibernate入门小示例** 在这个入门教程中,我们将探讨如何使用Hibernate框架在MyEclipse集成开发环境中,配合Oracle数据库进行基本的CRUD(创建、读取、更新和删除)操作。同时,我们还将利用JUnit进行单元测试,...

    一个很好的struts+hibernate源代码示例

    在"一个很好的struts+hibernate源代码示例"中,我们可以学习到如何将这两个框架有效地整合在一起,实现Web应用的数据管理和用户交互。首先,`testFrame.sql`文件通常包含了示例项目的数据库初始化脚本,这可能包括...

Global site tag (gtag.js) - Google Analytics