论坛首页 Java企业应用论坛

" Ibatis读写CLOB数据 --Klyuan" 读后感

浏览 4495 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-16  

读了Klyuan的"Ibatis读写CLOB数据", 感觉受益良多。其中涵盖了利用ibatis插入数据库BLOB/CLOB数据的四种方法. 其中尤属采用10g的驱动,和通过配置parameterMap和resultMap的方法最为简单,且没有局限性.可视为一个完美的解决方案.

四种方法中我尝试了除jdbc以外的三种方法, 在一开始都没有成功.最后发觉是oracle的驱动的问题. 原来用的是classes12.jar. 当使用最后一种采用oracle10g驱动的方法时,  他会报" java.sql.SQLException:数据大小超出此类型的最大值: 105542".  而当通过实现ibatis的回调接口来实现时,它会报oracle错误"ORA-24813: 不能发送或接收不受支持的 LOB" . 以下是我写的一个OracleBlobTypeHandlerCallback. 在原文中只有OracleClobTypeHandlerCallback.

java 代码
  1. package com.hank.utill;   
  2.   
  3. import oracle.sql.BLOB;   
  4. import java.sql.CallableStatement;   
  5. import java.sql.PreparedStatement;   
  6. import java.sql.ResultSet;   
  7. import java.sql.SQLException;   
  8.   
  9. import com.ibatis.sqlmap.client.extensions.ParameterSetter;   
  10. import com.ibatis.sqlmap.client.extensions.ResultGetter;   
  11. import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;   
  12.   
  13.   
  14. /**  
  15.  * @author hank  
  16.  * @date 2007-9-9  04:18:53  
  17.  * @version v1.0  
  18.  */  
  19. public class OracleBlobTypeHandlerCallback implements TypeHandlerCallback {   
  20.   
  21.     public Object getResult(ResultGetter getter) throws SQLException {   
  22.         BLOB blob = (BLOB) getter.getBlob();   
  23.            
  24.         return (blob == null || blob.length() == 0 )? null :blob.getBytes(0L, (int)blob.length());   
  25.     }   
  26.   
  27.     public void setParameter(ParameterSetter setter, Object obj) throws SQLException {   
  28.         BLOB blob = BLOB.empty_lob();   
  29.         blob.setBytes((byte[])obj);   
  30.         setter.setBlob(blob);      
  31.     }   
  32.   
  33.     public Object valueOf(String arg0) {   
  34.         // TODO Auto-generated method stub   
  35.         return null;   
  36.     }   
  37.   
  38. }  

在换成ojdbc14.jar驱动后,问题解决了. 呵呵!

在我sql文件中并没有使用parameterMap, 这是因为当我指定blob字段的javaType为"[]byte"时,  在tomcat服务器启动时会报错: java.lang.ClassNotFoundException: []byte. 目前问题仍未解决.....

另外我对原文中对前三种方法的分析有些还不是很明白.

--引用原文

上面三种方法都存在的问题:
1. 使用jdbc来实现,就失去了使用ibatis带来的便利,同时也失去了自动事务管理的能力,还有需要自己去手工管理连接对象。代码量也相当复杂。
2. 使用spring提供的处理器,不支持采用数据连接池的数据源,有很大的局限性。
3. 通过实现ibatis的回调接口来实现,也有一定的局限性,需要新增一个类,配置也不方便,还可能会出错。

--

对于第二点中提到的spring提供的处理器不支持数据连接池的数据源,  还有第三点提到的局限性还有待以后好好领悟.

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics