ibatis+spring存储blob数据

ibatis提供了TypeHandler接口,用于处理数据类型,基本的实现类为BaseTypeHandler 在spring 中,提供了AbstractLobTypeHandler作为基础类,并且提供了相应的模版方法,所有的工作由LobHandler处理。
   BlobByteArrayTypeHandler 主要用于处理blob类型数据,使用byte[]来映射相应的blob
   ClobStringTypeHandler 用于处理clob类型数据,使用字符串来映射Clob
   有一点需要注意的是,AbstractLobTypeHandler中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。


1。在spring的配置文件applicationContext.xml中配置

<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" /> 
    <bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
    	<property name="nativeJdbcExtractor">
    		<ref local="nativeJdbcExtractor"/>
    	</property>
    </bean>
	
    <!-- Spring iBatis SqlMapClient -->
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    	<property name="configLocation" value="classpath:sqlmap-config.xml"/>
    	<property name="dataSource" ref="dataSource"/>
    	<property name="lobHandler">  
         <ref local="oracleLobHandler"/>  
    	</property> 
  	</bean>
	<!-- 事务管理器 --> 
	<bean id="ibatisTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
   		<property name="dataSource" ref="dataSource"></property>
 	</bean>   
 	<!-- 事务拦截器  --> 
	<tx:advice id="txAdvice" transaction-manager="ibatisTransactionManager">
        <tx:attributes>
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
        </tx:attributes> 
    </tx:advice>
    <aop:config>
    	<aop:pointcut id="interceptorPointCuts" 
            expression="execution(public * com.junze.huiju.*.bo..*.*(..))" />
        <aop:advisor advice-ref="txAdvice"
            pointcut-ref="interceptorPointCuts" />
    </aop:config> 

注:必须要加入事务环绕才能使用

2)在ibatis配置文件sqlmap-config.xml中加入
<typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler" />

3)#PICDATA:BLOB#  指定自定义类型
<insert id="create" parameterClass="com.junze.huiju.module.sms.info.SMSInfo">
 <selectKey resultClass="int" keyProperty="ID" >  
          select seq_m_sms.nextVal as value from dual       
 </selectKey>
 insert into M_SMS(MLAT,MLON,PICDATA,PHONENUMBER,PHONENUMBERLIST,ID,PHONENAME,SMSDATA)
 values (#MLAT:VARCHAR2#,#MLON:VARCHAR2#,#PICDATA:BLOB#,#PHONENUMBER:VARCHAR2#,#PHONENUMBERLIST:VARCHAR2#,#ID#,#PHONENAME:VARCHAR2#,#SMSDATA:VARCHAR2#)
</insert>

 

2.接下来就是vo类了,这个类也比较简单

 public class Food {  
    private String content;  
    
      private String id;  
  
      private byte[] image;  
    
     private String name;      
          ...  
 }  

上面的只是提供参考,具体的类可根据需要自己写

 

3.取得文件的byte数组,赋值给image

这样子就OK了,但是如果你使用的是oracle的其他jdbc驱动而不是ojdbc14.jar.就会出现上传的文件超出大小限制的异常。

相关文章
相关标签/搜索