当前位置:编程学习 > JAVA >>

急求spring+ibatis处理clob类型数据解决方案(奉全分)

由于客户提出系统升级,要求某些功能支持>4000字节字符,所以现有的表结构不能满足需求,要修改成支持更大数据的clob类型。我们系统是spring+ibatis架构,在网上找了很多资料,spring+ibatis能够对clob数据类型有良好的支持。
分三步实现:
1、oracle支持,在dataAccessContext.xml中添加如下配置:
<!-- clob字段处理配置开始-->   
    <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"  
        lazy-init="true"/>   
    <!-- LobHandler for Oracle JDBC drivers -->   
    <!-- (refers to the NativeJdbcExtractor above to get access to native OracleConnections) -->   
    <bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler"  
        lazy-init="true">   
        <property name="nativeJdbcExtractor"><ref local="nativeJdbcExtractor"/></property> 
    </bean>   
   <!-- clob字段处理配置结束 -->  

<!-- SqlMap setup for iBATIS Database Layer -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

<property name="configLocation" value="WEB-INF/ibatis/sql-map-config.xml"/>

<property name="dataSource" ref="dataSource"/>
<!-- clob字段处理配置 -->   
       <property name="lobHandler"><ref local="oracleLobHandler"/></property>   

</bean>
2、ibatis支持,在sql-map-config.xml中添加配置:
<!-- 全局配置clob类型数据处理 -->
<typeHandler javaType="java.long.String" jdbcType="CLOB" callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/> 

3、最后在配置sql语句的xml中配置即可实现:
<insert id="dwfformf5000202">
        <selectKey resultClass="java.lang.Long" keyProperty="fileId">
            SELECT SEQ_FILEDATA.NEXTVAL AS id FROM DUAL
        </selectKey>
        INSERT INTO dwfformf5000202
        (fileid,filename,contenttype,filestream,filesize)
        VALUES(
        #fileId#,#fileName#,#contentType#,#fileStream#,#fileSize#)
    </insert>

    <resultMap id="FileData-Result-List" class="com.harvest.mcpc.accessory.domain.FileDataVO">
        <result property="fileId" column="fileId"/>
        <result property="fileName" column="fileName"/>
        <result property="contentType" column="contentType"/>
        <result property="fileSize" column="fileSize"/>
        <result property="fileStream" column="fileStream" jdbcType="CLOB"/>
    </resultMap>

    <select id="getFileDataStream" resultMap="FileData-Result-List">
        SELECT * FROM filedata WHERE fileid = #value#
    </select>
如上可以知道,这种方式的配置生效与否关键还是在第三步的<result property="fileStream" column="fileStream" jdbcType="CLOB"/>类型定义,因为<typeHandler javaType="java.long.String" jdbcType="CLOB" callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/> 是根据javaType和jdbcType参数决定是否处理为clob数据。
    工作中为了方便简洁,很多时候我们都是动态拼接表名(有些要求程序扩展性高的直接设计成可配置化),直接传入hashmap做参数实现存取数据,即:
<insert id="saveFormData" parameterClass="java.util.HashMap">
INSERT INTO $TABLE_NAME$
(WF_NUM,WF_SERIAL_NO,WORKLIST_ID,SUBMIT_TIME,CREATE_TIME,EMPLOYEE_ID,SUBMIT_DEPT,ACTIVITY_ID,$COLUMNNAME$)
values
(#WF_NUM#,#WF_SERIAL_NO#,#WORKLIST_ID#,$SUBMIT_TIME$,#CREATE_TIME#,#EMPLOYEE_ID#,#SUBMIT_DEPT#,#ACTIVITY_ID#,$COLUMNVALUE$)
</insert>     
<select id="getFormData" resultClass="java.util.HashMap">
select * from $TABLE_NAME$ where WORKLIST_ID = #WORKLIST_ID#
</select>
对于字段少的表可以通过配置resultmap标签,表字段多的表要维护resultmap是相当繁琐。很不幸的是小弟我接手项目是一个老项目,表也多,涉及升级表字段也多,而且是可配置的(即表字段可根据业务需求伸缩存取)。如果换成resultmap配置,非但配置文件要改,程序也要改,工作量也大。
亲爱的牛人、高手、大拿们,有没有一种方法修改量最小,能够实现对多个clob存取,达到升级目的的方法,帮帮小弟,小弟将感激不尽。全分奉上。。。。。。 --------------------编程问答-------------------- 很给力!解决了问题

配置中“2、ibatis支持,在sql-map-config.xml中添加配置:
<!-- 全局配置clob类型数据处理 -->
<typeHandler javaType="java.long.String" jdbcType="CLOB" callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/> ”

改为:“java.lang.String”

--------------------编程问答-------------------- java.lang.String,LS看得挺仔细。。 --------------------编程问答-------------------- 楼主在吗?最近我也遇到同样的问题,不知道怎么处理。能不能把这几个关联的xml发给我学习下
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,