您的位置:首页 > 数据库 > Oracle

Spring+Hibernate实现Oracle的BLOB、CLOB上传

2008-01-08 22:57 597 查看
现在网上有很多这方面的资料,但是很多都是互相转贴而来。2006年我们做了一个油田方面的项目,是关于油藏描述的,其中涉及了非常多的资料需要上传到Oracle数据库中,我查了很多资料,摸索了很长一段时间,现在我将自己总结的发布一下,如有什么问题,还请各位网友多多指导。

我们采用的是Spring1.2.7,Hibernate3.0,MyEclipse4.1,Eclipse3.1.1
服务器用Weblogic9.1
将Spring、Hibernate和commons-fileupload-1.0.jar等相应的jar文件加载;

1.pojo中:

Java代码



将BLOB字段映射为byte[],如:private byte[] wjsj;   

将CLOB字段映射为String;  

将BLOB字段映射为byte[],如:private byte[] wjsj;
将CLOB字段映射为String;


2.Hibernate映射文件(**.hbm.xml)中:

Java代码



BLOB字段映射为:org.springframework.orm.hibernate3.support.BlobByteArrayType,如:   

<property name="wjsj" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true">   

    <column name="WJSJ"/>   

</property>   

CLOB字段映射为:   

type="org.springframework.orm.hibernate3.support.ClobStringType"或type="text"  

BLOB字段映射为:org.springframework.orm.hibernate3.support.BlobByteArrayType,如:
<property name="wjsj" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true">
<column name="WJSJ"/>
</property>
CLOB字段映射为:
type="org.springframework.orm.hibernate3.support.ClobStringType"或type="text"


3.配置文件(applicationContext.xml)中:
引用
Oracle的Lob字段和一般类型的字段在操作上有一个明显的区别--那就是你必须首先通过Oracle的empty_blob()/empty_clob()初始化Lob字段,然后获取该字段的引用,通过这个引用更改其值。所以要完成对Lob字段的操作,必须执行两步数据库访问操作,先Insert再Update。BlobByteArrayType数据类型通过LobHandler将两次数据访问的动作隐藏起来,使Blob字段的操作在表现上和其他一般字段业类型无异。LobHandler必须注入到Hibernate会话工厂sessionFactory中,因为sessionFactory负责产生与数据库交互的Session。

Java代码



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

</bean>   

<bean id="lobHandler"  

      class="org.springframework.jdbc.support.lob.OracleLobHandler"  

      lazy-init="true">   

   <property name="nativeJdbcExtractor">   

      <ref local="nativeJdbcExtractor" />   

   </property>   

</bean>   

//Spring对文件上传的支持由内置的multipart包中的插件对象MultipartResovler来完成的,使用common-fileupload.jar的调用方法   

<bean id="multipartResolver"    

    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    

    <property name="maxUploadSize">   

       <value>1073741824</value>//设置上传文件最大值   

    </property>   

    <property name="maxInMemorySize">   

       <value>1048576</value>   

    </property>   

</bean>   

  

<bean id="sessionFactory"  

    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   

    <property name="dataSource" ref="dataSource"/>   

    <property name="lobHandler" ref="lobHandler"/>将上面的lobHandler注入到Hibernate的Session工厂中   

    <property name="mappingDirectoryLocations">      

      <list>      

         <value>classpath:/com/fileuplaod/spring/pojo</value>      

      </list>   

   </property>   

   <property name="hibernateProperties">   

      <props>   

         <prop key="hibernate.dialect">${hibernate.dialect}</prop>   

         <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>   

         <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>   

         <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>   

     </props>   

   </property>   

</bean>  

<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"    lazy-init="true">
</bean>
<bean id="lobHandler"
class="org.springframework.jdbc.support.lob.OracleLobHandler"
lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
//Spring对文件上传的支持由内置的multipart包中的插件对象MultipartResovler来完成的,使用common-fileupload.jar的调用方法
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>1073741824</value>//设置上传文件最大值
</property>
<property name="maxInMemorySize">
<value>1048576</value>
</property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="lobHandler" ref="lobHandler"/>将上面的lobHandler注入到Hibernate的Session工厂中
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/com/fileuplaod/spring/pojo</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
</props>
</property>
</bean>


4.页面中:

Java代码



在form中加enctype=“multipart/form-data”属性;  

在form中加enctype=“multipart/form-data”属性;


5.控制类(Controller)中:
继承自org.springframework.web.servlet.mvc.multiaction.MultiActionController

Java代码



abstract public class BaseController extends MultiActionController {   

/**  

* 初始化binder,注册Editor  

 */  

   protected void initBinder(HttpServletRequest request,   

            ServletRequestDataBinder binder) {   

        binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());//BLOB   

        binder.registerCustomEditor(String.class, new StringMultipartFileEditor());//CLOB   

   }   

}  

abstract public class BaseController extends MultiActionController {
/**
* 初始化binder,注册Editor
*/
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) {
binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());//BLOB
binder.registerCustomEditor(String.class, new StringMultipartFileEditor());//CLOB
}
}


Java代码



/**  

* 绑定并校验对象  

*控制类中最重要的方法是initBinder()它给spring注册了一个编辑器对request中的mu*ltipart实体进行处理,如果没有这个方法,上传将不能进行。  

*/  

protected BindException bindObject(HttpServletRequest request,   

    Object command) throws Exception {   

    preBind(request, command);   

  

    ServletRequestDataBinder binder = createBinder(request, command);   

    initBinder(request,binder);   

    binder.bind(request);   

}  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息