`

hibernate存取图片示例(mysql)

阅读更多

一般网站在处理用户上传图片时通常采用两种策略:一是直接把图片存入数据库中的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"/>
分享到:
评论

相关推荐

    Hibernate示例

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

    Struts2+Spring3+Hibernate3学习示例

    在运行示例前,你需要创建对应的数据库和表,并配置项目的数据库连接信息,以确保数据能正确地存取。 总的来说,这个"Struts2+Spring3+Hibernate3学习示例"是一个完整的Java Web开发基础架构,它展示了如何集成这三...

    使用Hibernate连接MySql的入门小程序

    编译并运行`Main.java`,观察控制台输出,确认数据是否成功存取到MySQL数据库中。 通过这个简单的例子,你可以了解到如何在实际项目中使用Hibernate来操作MySQL数据库。随着对Hibernate的深入理解,你可以利用它的...

    使用Struts2上传图片存取到Mysql中并读取出来显示在页面上_好资源0分送

    本文将详细介绍如何利用Struts2框架结合Spring和Hibernate技术栈实现图片的上传、存储至MySQL数据库以及从数据库读取并在Web页面展示的功能。整个过程不涉及Servlet的操作。 #### 需求分析与实现目标 1. **图片...

    网上书城系统(Struts+Hibernate+Mysql).zip

    网上书城系统是一个基于Struts、Hibernate和MySQL的典型企业级应用示例,它展示了如何将这三种技术结合使用来构建一个完整的Web应用程序。在这个系统中,Struts作为MVC(模型-视图-控制器)框架负责处理用户请求并...

    Hibernate Eclipse开发必备包

    在Java世界中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存取。Eclipse作为一款强大的Java集成开发环境(IDE),为开发者提供了丰富的插件...

    Hibernate简单的demo

    Hibernate 是一款强大的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是繁琐的数据存取。这个“Hibernate简单的demo”是为了帮助初学者理解并快速上手Hibernate框架而设计的。 **...

    Spring2.0+hibernate3.1+log4j+mysql demo

    标题“Spring2.0+hibernate3.1+log4j+mysql demo”揭示了一个集成开发环境,其中包含了四个核心的技术组件:Spring框架的2.0版本、Hibernate ORM框架的3.1版本、日志工具log4j以及MySQL数据库。这个组合常用于构建...

    hibernate--1.搭建hibernate环境

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是底层的数据存取细节。本教程将详细讲解如何搭建Hibernate开发环境,以便进行高效、便捷的...

    hibernate-demo.zip

    【hibernate-demo.zip】是一个压缩包,其中包含了一个使用Eclipse集成开发环境搭建的Hibernate框架访问MariaDB数据库的示例项目。这个项目旨在帮助开发者理解如何在Java应用中运用Hibernate进行数据持久化操作,同时...

    Hibernate环境搭建案例

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQL5Dialect &lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; &lt;property name="hibernate.connection.url"&gt;...

    hibernate整合ehcache的jar包.zip

    Hibernate支持多种数据库,包括MySQL、Oracle、PostgreSQL等。 **2. Ehcache介绍** Ehcache是一个内存缓存系统,用于存储临时数据,以提高数据检索速度。它可以缓存任何Java对象,并且支持本地和分布式缓存模式。...

    hibernate 配置

    Hibernate 是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者可以更加专注于业务逻辑,而非繁琐的数据存取操作。在本篇文章中,我们将深入探讨Hibernate的配置过程及其核心概念。 一、...

    快速构建你的hibernate

    在Java开发中,Hibernate是一个非常流行的持久化框架,它极大地简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的数据存取。本教程将介绍如何利用特定工具快速构建Hibernate项目,以便更高效地管理和操作...

    马士兵java框架hibernate学习笔记

    - **环境配置**:包括了如何配置MySQL数据库、创建必要的表结构,并设置Hibernate的核心配置文件`hibernate.cfg.xml`。 - **实体类设计**:如何根据数据库表结构设计对应的Java实体类,并通过XML或注解的方式完成...

    Hibernate+Struts数据库操作实例

    总结起来,"Hibernate+Struts数据库操作实例"是一个综合性的示例,旨在教授开发者如何利用这两个框架高效地实现Web应用的数据库管理。通过实践这个实例,开发者不仅可以掌握Hibernate和Struts的基本用法,还能了解到...

    hIbernate扫盲篇

    通过将Java对象与数据库表之间的映射关系定义在XML配置文件(hibernate.cfg.xml)或注解中,Hibernate能够自动完成数据的存取工作。 ### 二、环境准备 1. **JDK安装**:确保你的开发环境中已经安装了JDK,并且版本...

Global site tag (gtag.js) - Google Analytics