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

<script type="text/javascript"> new Draggable("related_topics"); </script> 现在网上有很多这方面的资料,但是很多都是互相转贴而来。2006年我们做了一个油田方面的项目,是关于油藏描述的,其中涉及了非常多的资料需要上传到 Oracle数据库中,我查了很多资料,摸索了很长一段时间,现在我将自己总结的发布一下,如有什么问题,还请各位网友多多指导。

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

1.pojo中:
Java代码 复制代码
  1. BLOB字段映射为byte[],如:private byte[] wjsj;   
  2. 将CLOB字段映射为String;  
BLOB字段映射为byte[],如:private byte[] wjsj;
将CLOB字段映射为String;

2. Hibernate映射文件(**.hbm.xml)中:
Java代码 复制代码
  1. BLOB字段映射为:org.springframework.orm.hibernate3.support.BlobByteArrayType,如:   
  2. <property name="wjsj" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true">   
  3.     <column name="WJSJ"/>   
  4. </property>   
  5. CLOB字段映射为:   
  6. 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代码 复制代码
  1. <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"    lazy-init="true">   
  2. </bean>   
  3. <bean id="lobHandler"  
  4.       class="org.springframework.jdbc.support.lob.OracleLobHandler"  
  5.       lazy-init="true">   
  6.    <property name="nativeJdbcExtractor">   
  7.       <ref local="nativeJdbcExtractor" />   
  8.    </property>   
  9. </bean>   
  10. //Spring对文件上传的支持由内置的multipart包中的插件对象MultipartResovler来完成的,使用common-fileupload.jar的调用方法   
  11. <bean id="multipartResolver"    
  12.     class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    
  13.     <property name="maxUploadSize">   
  14.        <value>1073741824</value>//设置上传文件最大值   
  15.     </property>   
  16.     <property name="maxInMemorySize">   
  17.        <value>1048576</value>   
  18.     </property>   
  19. </bean>   
  20.   
  21. <bean id="sessionFactory"  
  22.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  23.     <property name="dataSource" ref="dataSource"/>   
  24.     <property name="lobHandler" ref="lobHandler"/>将上面的lobHandler注入到Hibernate的Session工厂中   
  25.     <property name="mappingDirectoryLocations">      
  26.       <list>      
  27.          <value>classpath:/com/fileuplaod/spring/pojo</value>      
  28.       </list>   
  29.    </property>   
  30.    <property name="hibernateProperties">   
  31.       <props>   
  32.          <prop key="hibernate.dialect">${hibernate.dialect}</prop>   
  33.          <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>   
  34.          <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>   
  35.          <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>   
  36.      </props>   
  37.    </property>   
  38. </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代码 复制代码
  1. 在form中加enctype=“multipart/form-data”属性;  
在form中加enctype=“multipart/form-data”属性;

5.控制类(Controller)中:
继承自org. springframework.web.servlet.mvc.multiaction.MultiActionController
Java代码 复制代码
  1. abstract public class BaseController extends MultiActionController {   
  2. /**  
  3. * 初始化binder,注册Editor  
  4.  */  
  5.    protected void initBinder(HttpServletRequest request,   
  6.             ServletRequestDataBinder binder) {   
  7.         binder.registerCustomEditor(byte[].classnew ByteArrayMultipartFileEditor());//BLOB   
  8.         binder.registerCustomEditor(String.classnew StringMultipartFileEditor());//CLOB   
  9.    }   
  10. }  
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代码 复制代码
  1. /**  
  2. * 绑定并校验对象  
  3. *控制类中最重要的方法是initBinder()它给spring注册了一个编辑器对request中的mu*ltipart实体进行处理,如果没有这个方法,上传将不能进行。  
  4. */  
  5. protected BindException bindObject(HttpServletRequest request,   
  6.     Object command) throws Exception {   
  7.     preBind(request, command);   
  8.   
  9.     ServletRequestDataBinder binder = createBinder(request, command);   
  10.     initBinder(request,binder);   
  11.     binder.bind(request);   
  12. }  
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值