mysql spring blob

在使用struts+spring+ hibernate的开发中,有些时候用户会有数据库存储文件的需求,在数据库中一般会采用
Blob字段或Clob字段来存储二进制图片、流媒体或文件。现就将在实际开发中遇到的问题及解决方法告之。

一、问题需求:

1.在持久化类中字段该用什么类型?
2.在Struts中文件对应的数据类型是什么?
3.在 Hibernate中字段对应的类型是什么?
4.如何在Spring中处理这些文件?
5.下面有两种解决方案,方案二比方案一更简单.

二、解决方案一:

1.在数据库中这些文件最终是以字节的形式存储二进制对象,所以在持久化类中将相应的属性定义为byte[]类型。

2.在Struts中可以使用<html:file property="" />标签来上传文件,所以与之对应的ActionForm的属性类型为:
FormFile(org.apache.struts.upload.FormFile)类型,即使是使用了动态Form同理也是使用该类型.
提示:同时要将form标签修改为<html:form action="/Action.do" method="post" enctype= "multipart/form-data">
以支持文件上传后取得上传数据。在给持久对象赋值时只需调用(FormFile) form.get("property")).getFileData();
方法即可返回byte[]。

3.在 Hibernate中文件列对应的类型可以是org.springframework.orm.hibernate3.support.BlobByteArrayType,
org.springframework.orm.hibernate3.support.ClobStringType、clob、 blob、binary。什么时候用BlobBYteArrayType
什么时候用ClobStringType?一般如果要处理的对象是数据库字段类型是 blob时(主要是图片,二进制对象等),
映射文件设置为:org.springframework.orm.hibernate3.support.BlobByteArrayType 数据库字段是clob(大文本对象)
类型时,要将java的属性的类型定为String,映射文件设置为: org.springframework.orm.hibernate3.support.ClobStringType。

4.如果在spring上要使用Struts中自带的上传功能必须在spring的配置文件中加以声明.否者将会出现?
簀ava.lang.IllegalStateException: No LobHandler found for configuration - lobHandler property
must be set on LocalSessionFactoryBean异常。配置如下:

(1).声明一个处理句柄:
    <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />
(2).在sessionFactory中注入lobHandler:
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="lobHandler" ref="lobHandler"/>
    </bean>

提示: 指定lobHandler时,对于 MySQL、DB2、MS SQL Server、Oracle 10g,使用DefaultLobHandler即可,而Oracle 9i,
则可以使用OracleLobHandler。因为Oracle9i处理lob的方式和其它的不太一样,所以这里要用spring提供的SimpleNativeJdbcExtractor.处理Oracle9i lob类型的特殊声明:

<bean id="nativeJdbcExtractor" lazy-init="true"    class="org.springframework.jdbc.support.nativejdbc.
SimpleNativeJdbcExtractor"/>

<bean id="lobHandler" lazy-init="true"     class="org.springframework.jdbc.support.lob.OracleLobHandler">
          <property name="nativeJdbcExtractor">
              <ref bean="nativeJdbcExtractor"/>
          </property>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  
<!-- 为处理 Blob类型字段的句柄声明 -->
<property name="lobHandler">
    <ref local="lobHandler" />
</property>
</bean>

同时还应该使用对应的JDBC驱动。

Clob字段定义:<property name="属性名" column="列名" type="org.springframework.orm. hibernate.support.ClobStringType"
length="1048"/>这里的length是指字节,最大可以到2G.该字段在java对象中声明为String类型。

       如果使用的是 mysql数据库其默认的上传文件大小只有1047552字节:如果上传的文件大于1047552字节则会出现异常
org.springframework.jdbc.UncategorizedSQLException: You can change this value on the server by setting
the max_allowed_packet' variable.根据提示可以修改 mysql数据库的max_allowed_packet属性大小。
打开my.ini文件中找到# SERVER SECTION后在port=3306下面加上max_allowed_packet=?M 修改完后重启 mysql服务即可成功上传。


解决方案二:
1.将驱动换为ojdbc14.jar,如果使用class12.jar会出错.
2.将数据库中的字段设为 blob型,如代码:
 
Java代码 复制代码
  1. create table photo   
  2.   (   
  3.        photoId number primary key,   
  4.        photo blob not null,   
  5.    );  
create table photo
  (
       photoId number primary key,
       photo blob not null,
   );

3.将*.hbm.xml文件中的字段类型设为java.sql. Blob型,如代码:
 
Java代码 复制代码
  1. <property name="photo" type="java.sql.Blob">   
  2.         <column name="PHOTO" not-null="true" />   
  3.   </property>  
<property name="photo" type="java.sql.Blob">
        <column name="PHOTO" not-null="true" />
  </property>

4.将pojo中的属性设为java.sql. Blob型,如代码:
 
Java代码 复制代码
  1. private Blob photo;   
  2.   public Blob getPhoto() {   
  3.         return this.photo;   
  4.     }   
  5.        
  6.     public void setPhoto(Blob photo) {   
  7.         this.photo = photo;   
  8.     }  
private Blob photo;
  public Blob getPhoto() {
        return this.photo;
    }
    
    public void setPhoto(Blob photo) {
        this.photo = photo;
    }

5.保存的时候:
 
Java代码 复制代码
  1. FileInputStream fis = new FileInputStream("c:\\a.jpg");   
  2.   photo.setPhoto(Hibernate.createBlob(fis));   
  3.   photoService.save(photo);  
FileInputStream fis = new FileInputStream("c:\\a.jpg");
  photo.setPhoto(Hibernate.createBlob(fis));
  photoService.save(photo);


保存操作完成.上面是对blob类型的操作,下面来看看对clob的操作:

1.同样要使用ojdbc14.jar作为驱动包.
2.将数据库中的字段设为clob型,如代码:
 
Java代码 复制代码
  1. create table chaptercontent   
  2.   (   
  3.        content clob not null,   
  4.    );  
create table chaptercontent
  (
       content clob not null,
   );

3.将*.hbm.xml文件的字段类型设为text型,如代码:
 
Java代码 复制代码
  1. <property name="content" type="text">   
  2.          <column name="CONTENT" not-null="true" />   
  3.   </property>  
<property name="content" type="text">
         <column name="CONTENT" not-null="true" />
  </property>

5.将pojo上的属性设为String型,如代码:
 
Java代码 复制代码
  1. private String content;   
  2.   public String getContent() {   
  3.         return this.content;   
  4.     }   
  5.        
  6.     public void setContent(String content) {   
  7.         this.content = content;   
  8.     }  
private String content;
  public String getContent() {
        return this.content;
    }
    
    public void setContent(String content) {
        this.content = content;
    }

经过这些操作之后,我们就可以将clob型的字段当作String型来操作了.
如保存时:
   
Java代码 复制代码
  1. pojoObj.setContent("保存的值");   
  2.     dao.save(pojoObj);  
pojoObj.setContent("保存的值");
    dao.save(pojoObj);

这样就可以了哦. 很简单了吧!哈哈..........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值