一般网站在处理用户上传图片时通常采用两种策略:一是直接把图片存入数据库中的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"/>
简单的例子,希望对初学者有帮助.
附记:如果不希望在servlet(或者action之类)中进行保存操作,希望在DAO进行此操作,那么InputStream的关闭问题可以通过hibernate的interceptor机制解决
分享到:
相关推荐
这个“Hibernate学习代码示例”压缩包文件为初学者提供了丰富的学习资源,帮助他们理解并掌握Hibernate的核心概念和实际应用。 首先,让我们详细探讨一下Hibernate的基础知识。Hibernate是一个开源的ORM框架,它的...
在本示例中,我们将探讨如何使用 Hibernate 进行基本的数据存取操作。 **环境准备** 在开始 Hibernate 示例之前,我们需要确保以下组件已经准备就绪: 1. JDK:确保安装了 Java 开发环境,并设置好 `JAVA_HOME` ...
### Hibernate 存取 Oracle 的 CLOB 在 Java 开发中,使用 Hibernate 框架进行数据库操作是非常常见的。其中,处理 Oracle 数据库中的 CLOB 类型数据是一项重要的技能。CLOB(Character Large Object)是一种用于...
在Java的数据库编程中,有时我们需要处理存储大量二进制数据的情况,比如图片、音频或视频文件等。这种数据通常会被存储在BLOB(Binary Large Object)类型的字段中。本篇将详细介绍如何使用JDBC(Java Database ...
在运行示例前,你需要创建对应的数据库和表,并配置项目的数据库连接信息,以确保数据能正确地存取。 总的来说,这个"Struts2+Spring3+Hibernate3学习示例"是一个完整的Java Web开发基础架构,它展示了如何集成这三...
测试类会创建并操作持久化对象,调用辅助类的方法,验证数据是否正确地存取到数据库中。例如,创建一个新的User对象,保存到数据库,然后查询验证其是否成功存储。 5. **配置文件(Hibernate.cfg.xml)**:每个...
标题中的“hibernate存取json数据的代码分析”指的是在Java开发中,使用Hibernate框架来存储和检索JSON格式的数据。Hibernate是一个强大的ORM(对象关系映射)框架,它允许开发者将Java对象直接映射到数据库表,但在...
在多表操作中,这三个框架协同工作,使得数据的存取和业务逻辑的处理变得更加便捷。以下将详细介绍如何利用Struts2、Hibernate和Spring进行多表操作: 1. **Struts2**:作为前端控制器,Struts2接收用户的HTTP请求...
在Java世界中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据存取。Eclipse作为一款强大的Java集成开发环境(IDE),为开发者提供了丰富的插件...
标题"spring+hibernate整合demo"表明这是一个示例项目,展示了如何将Spring和Hibernate这两个框架结合使用。整合Spring和Hibernate可以使应用程序更易于管理,因为Spring可以控制Hibernate的生命周期,并提供事务...
Hibernate 是一款强大的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是繁琐的数据存取。这个“Hibernate简单的demo”是为了帮助初学者理解并快速上手Hibernate框架而设计的。 **...
这里我们可以理解为,这是一个关于Hibernate框架的示例项目,它使用了Microsoft SQL Server 2008作为后端数据库。Hibernate是Java开发中常用的一个对象关系映射(ORM)框架,它能够将Java类与数据库表进行映射,简化...
例如,一个在线聊天室应用,用户发送的消息通过WebSocket实时传递给其他在线用户,同时这些消息在数据库中的存取则由Spring和Hibernate协同完成。 5. **源码和工具**: 标签“源码”意味着这个示例可能包含实际的...
在这个例子中,我们可能会看到如何创建实体类、配置Hibernate的XML映射文件,以及如何在代码中使用SessionFactory和Session来存取数据。 【标签解析】 "Hibernate"标签明确了讨论的主题,即Hibernate ORM框架。这个...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程模型来操作数据库,从而简化了Java应用程序中的数据存取工作。在Java世界中,Hibernate 已经成为了开发人员处理数据库交互的标准...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是底层的数据存取细节。本教程将深入探讨如何使用Hibernate构建一个完整的CRUD(创建、读取、...
通过ORM技术,Hibernate能够在Java对象和关系数据库之间建立一种映射关系,使得开发人员可以直接操作Java对象来进行数据的存取,而无需编写复杂的SQL语句。 #### 二、为什么选择Hibernate? 1. **减少SQL编写**:...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程模型来操作数据库,从而简化了Java应用程序中的数据存取工作。在Java世界里,Hibernate 已经成为了开发人员处理数据库交互的标准...
在"Hibernate 参考实例"中,我们将深入探讨如何使用Hibernate进行数据存取,包括基本的配置、实体类的创建、映射文件的编写、Session的使用以及查询操作。下面将详细介绍这些关键知识点。 1. **基本配置**: 使用...
1. **Hibernate存取JSON数据(换一种思路来存取数据)** 在某些场景下,如订单系统中存储优惠信息,这些信息可能是只读且不需频繁变更的文本数据。传统的做法可能涉及创建关联表,但这可能导致不必要的复杂性。一个...