最近生产环境上因数据库某一字段类型由VARCHAR2(4000)改为CLOB后,报如下异常:
从异常信息观察,应该是com.ibatis.sqlmap.engine.type.StringTypeHandler.setParameterv即iBatis报出来的,通过代码跟踪,进入com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.class类中的update方法如下:
继续跟踪到com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.class类中,请看executeUpdate方法如下:
注意ParameterMap parameterMap = sql.getParameterMap(request, parameterObject);这句 ,继续跟踪,在com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.class中有如下方法,注意dynSql = new SimpleDynamicSql(this.delegate, dynSql).getSql(request, parameterObject);这句
继续跟踪到箭头所示 getSql(request, parameterObject)就去里,找着如下代码:这里应该是获取对应的类型转换器,继续跟踪到com.ibatis.sqlmap.engine.type.TypeHandlerFactory.class类中,发现该类创建了所有默认的类型转换器。
很明显,CLOB类型调了自定义类型转换器 new CustomTypeHandler(new ClobTypeHandlerCallback())),于是继续跟踪到ClobTypeHandlerCallback.class里面,发现有如下代码:对于insert同样的方法处理,我测试的项目中select语句没有报错,如报错select中比较直观,可以按如下方法
iBatis:ibatis-sqlmap-2.3.0
Spring:Spring-*-3.0.5.REALEASE
Oracle: oracle11g
Oracle驱动: ojdbc14