IBATIS 寫BLOB欄位遇到的問題
阿新 • • 發佈:2018-11-30
1、 首先遇到的配置問題,通過設定typeHandler 來支援寫入。接下來由此引出了事務的問題。
<typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler" />
2、引入了typeHandler 之後,隨之而來的是事務處理機制。
<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 bean="nativeJdbcExtractor"></ref> </property> </bean> <bean id="*SqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource"> <ref bean="epbpDataSource"/> </property> <property name="configLocation"> <value>classpath:config/*-iBatisConfig.xml</value> </property> <property name="lobHandler"> <ref local="oracleLobHandler"></ref> </property> </bean>
引入了這些。在配置事務的時候,從網上查了多種方式都不可行。最後判斷可能與公司框架有關係。因為這個專案是在原先有一套資料來源的基礎上新增加了一套資料來源。
3、那麼我的目標是寫入BLOB不考慮事務處理。我最終調整了typeHandler 終實現了。
<typeHandler jdbcType="BLOB" javaType="[B" callback="com.ibatis.sqlmap.engine.type.BlobTypeHandlerCallback" />
在這裡使用了isEmpty 與 isNotEmpty 遇到一個問題是
java.sql.SQLException: 索引中丟失 IN 或 OUT 引數:: 17
初步判斷 是因為如果clob欄位為空會導致資料項缺失。
<insert id="#######" parameterClass="*"> INSERT INTO ****** (ID, XH, FJMC, FJSM, BLCDM, FJNR, CJR, CJSJ, XGR, XGSJ, SHR, SHRQ, SHZT, JGDM) VALUES(#id#, #xh#, #fjmc#, #fjsm#, #blcdm#, <isEmpty property="fjnr"> null, </isEmpty> <isNotEmpty property="fjnr"> #fjnr:BLOB#, </isNotEmpty> #cjr#, to_date(#cjsj#,'yyyy-mm-dd'), #xgr#, to_date(#xgsj#,'yyyy-mm-dd'), #shr#, to_date(#shrq#,'yyyy-mm-dd'), #shzt#, #jgdm#) </insert>