Author: cbegin
Date: Thu Feb 25 02:14:48 2010
New Revision: 916087
URL: http://svn.apache.org/viewvc?rev=916087&view=rev
Log:
implemented better type handler detection in unknowntypehandler.
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/type/UnknownTypeHandler.java
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/type/UnknownTypeHandler.java
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/type/UnknownTypeHandler.java?rev=916087&r1=916086&r2=916087&view=diff
==============================================================================
---
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/type/UnknownTypeHandler.java
(original)
+++
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/type/UnknownTypeHandler.java
Thu Feb 25 02:14:48 2010
@@ -1,6 +1,6 @@
package org.apache.ibatis.type;
-import org.apache.ibatis.exceptions.IbatisException;
+import org.apache.ibatis.io.Resources;
import java.sql.*;
import java.util.*;
@@ -58,10 +58,7 @@
Integer columnIndex = columnIndexLookup.get(column);
TypeHandler handler = null;
if (columnIndex != null) {
- int jdbcTypeInt = rsmd.getColumnType(columnIndex);
- JdbcType jdbcType = JdbcType.forCode(jdbcTypeInt);
-
- handler = typeHandlerRegistry.getTypeHandler(jdbcType);
+ handler = resolveTypeHandler(rsmd, columnIndex);
}
if (handler == null || handler instanceof UnknownTypeHandler) {
handler = OBJECT_TYPE_HANDLER;
@@ -72,4 +69,34 @@
}
}
+ private TypeHandler resolveTypeHandler(ResultSetMetaData rsmd, Integer
columnIndex) throws SQLException {
+ TypeHandler handler = null;
+ JdbcType jdbcType = safeGetJdbcTypeForColumn(rsmd, columnIndex);
+ Class javaType = safeGetClassForColumn(rsmd, columnIndex);
+ if (javaType != null && jdbcType != null) {
+ handler = typeHandlerRegistry.getTypeHandler(javaType, jdbcType);
+ } else if (javaType != null) {
+ handler = typeHandlerRegistry.getTypeHandler(javaType);
+ } else if (jdbcType != null) {
+ handler = typeHandlerRegistry.getTypeHandler(jdbcType);
+ }
+ return handler;
+ }
+
+ private JdbcType safeGetJdbcTypeForColumn(ResultSetMetaData rsmd, Integer
columnIndex) {
+ try {
+ return JdbcType.forCode(rsmd.getColumnType(columnIndex));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private Class safeGetClassForColumn(ResultSetMetaData rsmd, Integer
columnIndex) {
+ try {
+ return Resources.classForName(rsmd.getColumnClassName(columnIndex));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
}
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java?rev=916087&r1=916086&r2=916087&view=diff
==============================================================================
---
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java
(original)
+++
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/type/UnknownTypeHandlerTest.java
Thu Feb 25 02:14:48 2010
@@ -31,6 +31,8 @@
will(returnValue(1));
one(rsmd).getColumnName(with(any(int.class)));
will(returnValue("column"));
+ one(rsmd).getColumnClassName(with(any(int.class)));
+ will(returnValue(String.class));
one(rsmd).getColumnType(with(any(int.class)));
will(returnValue(JdbcType.VARCHAR.TYPE_CODE));
one(rs).getString(with(any(String.class)));