spring hibernate 处理blob与clob类型
2015-02-10 20:01
405 查看
http://www.thinksaas.cn/group/topic/197458/
http://www.360doc.com/content/10/0917/10/3043847_54299063.shtml
在使用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型,如代码:
3.将*.hbm.xml文件中的字段类型设为java.sql.Blob型,如代码:
4.将pojo中的属性设为java.sql.Blob型,如代码:
5.保存的时候:
保存操作完成.上面是对blob类型的操作,下面来看看对clob的操作: 1.同样要使用ojdbc14.jar作为驱动包.
2.将数据库中的字段设为clob型,如代码:
3.将*.hbm.xml文件的字段类型设为text型,如代码:
5.将pojo上的属性设为String型,如代码:
经过这些操作之后,我们就可以将clob型的字段当作String型来操作了. 如保存时:
http://www.360doc.com/content/10/0917/10/3043847_54299063.shtml
在使用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型,如代码:
create table photo ( photoId number primary key, photo blob not null, );
3.将*.hbm.xml文件中的字段类型设为java.sql.Blob型,如代码:
<property name="photo"type="java.sql.Blob"> <column name="PHOTO"not-null="true"/> </property>
4.将pojo中的属性设为java.sql.Blob型,如代码:
private Blob photo; public Blob getPhoto() { return this.photo; } public void setPhoto(Blob photo) { this.photo = photo; }
5.保存的时候:
FileInputStream fis = new FileInputStream("c:\a.jpg"); photo.setPhoto(Hibernate.createBlob(fis)); photoService.save(photo);
保存操作完成.上面是对blob类型的操作,下面来看看对clob的操作: 1.同样要使用ojdbc14.jar作为驱动包.
2.将数据库中的字段设为clob型,如代码:
create table chaptercontent ( content clob not null, );
3.将*.hbm.xml文件的字段类型设为text型,如代码:
<property name="content"type="text"> <column name="CONTENT"not-null="true"/> </property>
5.将pojo上的属性设为String型,如代码:
private String content; public String getContent() { return this.content; } public void setContent(String content) { this.content = content; }
经过这些操作之后,我们就可以将clob型的字段当作String型来操作了. 如保存时:
pojoObj.setContent("保存的值"); dao.save(pojoObj);
相关文章推荐
- Spring+hibernate对clob、blob字段的处理方法
- spring+hibernate中clob、blob字段的处理方法
- Spring+Hibernate中处理Oracle的大字段(clob二进制\blob大字符串)
- hibernate+spring处理BLOB,CLOB字段
- hibernate 4+spring 处理mysql blob类型
- hibernate对oracle数据库CLOB、blob类型字段处理原则
- spring+hibernate中clob、blob字段的处理方法
- 使用Spring+Hibernate实现Oracle数据库BlOB数据类型的读写
- Spring ,Hibernate clob大字段处理
- Hibernate+Spring彻底搞定Clob、Blob的存取
- 【转】hibernate oracle blob数据类型的处理
- jdbc hibernate ibatis 操作Blob 和Clob类型字段(不断更新)
- spring+hibernate的clob大字段处理
- Hibernate+Spring搞定Clob、Blob的存取
- Hibernate+Spring彻底搞定Clob、Blob的存取
- Hibernate读写Clob和Blob类型字段
- 使用Spring+Hibernate实现Oracle数据库BlOB数据类型的读写
- Spring+Hibernate实现Oracle的BLOB、CLOB上传
- Spring+Struts+Hibernate 架构中对Oracle9i中clob字段的处理之--新增数据篇
- APPFUSE项目中spring+hibernate+oracle中使用BLOB类型