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)));


Reply via email to