You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2009/06/27 08:06:24 UTC

svn commit: r788925 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/builder/ main/java/org/apache/ibatis/builder/xml/dynamic/ main/java/org/apache/ibatis/executor/ main/java/org/apache/ibatis/executor/parameter/ main/jav...

Author: cbegin
Date: Sat Jun 27 06:06:24 2009
New Revision: 788925

URL: http://svn.apache.org/viewvc?rev=788925&view=rev
Log:
Fixed dynamic SQL foreach tag for typesafe beans

Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSource.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/BoundSql.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlTest.java

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java?rev=788925&r1=788924&r2=788925&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java Sat Jun 27 06:06:24 2009
@@ -43,12 +43,13 @@
       StringTokenizer parameterMappingParts = new StringTokenizer(content, ", ");
       String property = parameterMappingParts.nextToken();
       Class propertyType;
+      MetaClass metaClass = MetaClass.forClass(parameterType);
       if (typeHandlerRegistry.hasTypeHandler(parameterType)) {
         propertyType = parameterType;
-      } else if (Map.class.isAssignableFrom(parameterType)) {
-        propertyType = Object.class;
+      } else if (metaClass.hasGetter(property)){
+        propertyType = metaClass.getGetterType(property);
       } else {
-        propertyType = MetaClass.forClass(parameterType).getGetterType(property);
+        propertyType = Object.class;
       }
       ParameterMapping.Builder builder = new ParameterMapping.Builder(configuration, property, propertyType);
       while (parameterMappingParts.hasMoreTokens()) {

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSource.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSource.java?rev=788925&r1=788924&r2=788925&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSource.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSource.java Sat Jun 27 06:06:24 2009
@@ -3,6 +3,8 @@
 import org.apache.ibatis.builder.SqlSourceBuilder;
 import org.apache.ibatis.mapping.*;
 
+import java.util.Map;
+
 public class DynamicSqlSource implements SqlSource {
 
   private Configuration configuration;
@@ -19,7 +21,11 @@
     SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);
     Class parameterType = parameterObject == null ? Object.class : parameterObject.getClass();
     SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType);
-    return sqlSource.getBoundSql(parameterObject);
+    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
+    for (Map.Entry<String,Object> entry : context.getBindings().entrySet()) {
+      boundSql.setAdditionalParameter(entry.getKey(),entry.getValue());
+    }
+    return boundSql;
   }
 
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java?rev=788925&r1=788924&r2=788925&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java Sat Jun 27 06:06:24 2009
@@ -111,7 +111,12 @@
       } else {
         MetaObject metaObject = MetaObject.forObject(parameterObject);
         for (ParameterMapping parameterMapping : parameterMappings) {
-          cacheKey.update(metaObject.getValue(parameterMapping.getProperty()));
+          String propertyName = parameterMapping.getProperty();
+          if (metaObject.hasGetter(propertyName)) {
+            cacheKey.update(metaObject.getValue(propertyName));
+          } else if (boundSql.hasAdditionalParameter(propertyName)) {
+            cacheKey.update(boundSql.getAdditionalParameter(propertyName));
+          }
         }
       }
     }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java?rev=788925&r1=788924&r2=788925&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java Sat Jun 27 06:06:24 2009
@@ -38,16 +38,19 @@
         ParameterMapping parameterMapping = parameterMappings.get(i);
         if (parameterMapping.getMode() != ParameterMode.OUT) {
           Object value;
+          String propertyName = parameterMapping.getProperty();
           if (parameterObject == null) {
             value = null;
           } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
             value = parameterObject;
+          } else if (boundSql.hasAdditionalParameter(propertyName)) {
+            value = boundSql.getAdditionalParameter(propertyName);
           } else {
-            value = metaObject == null ? null : metaObject.getValue(parameterMapping.getProperty());
+            value = metaObject == null ? null : metaObject.getValue(propertyName);
           }
           TypeHandler typeHandler = parameterMapping.getTypeHandler();
           if (typeHandler == null) {
-            throw new ExecutorException("There was no TypeHandler found for parameter " + parameterMapping.getProperty() + " of statement " + mappedStatement.getId());
+            throw new ExecutorException("There was no TypeHandler found for parameter " + propertyName + " of statement " + mappedStatement.getId());
           }
           typeHandler.setParameter(ps, i + 1, value, parameterMapping.getJdbcType());
         }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/BoundSql.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/BoundSql.java?rev=788925&r1=788924&r2=788925&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/BoundSql.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/BoundSql.java Sat Jun 27 06:06:24 2009
@@ -1,17 +1,21 @@
 package org.apache.ibatis.mapping;
 
 import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
 
 public class BoundSql {
 
   private String sql;
   private List<ParameterMapping> parameterMappings;
   private Object parameterObject;
+  private Map<String,Object> additionalParameters;
 
   public BoundSql(String sql, List<ParameterMapping> parameterMappings, Object parameterObject) {
     this.sql = sql;
     this.parameterMappings = parameterMappings;
     this.parameterObject = parameterObject;
+    this.additionalParameters = new HashMap<String,Object>();
   }
 
   public String getSql() {
@@ -26,4 +30,15 @@
     return parameterObject;
   }
 
+  public boolean hasAdditionalParameter(String name) {
+    return additionalParameters.containsKey(name);
+  }
+
+  public void setAdditionalParameter(String name, Object value) {
+    additionalParameters.put(name, value);
+  }
+
+  public Object getAdditionalParameter(String name) {
+    return additionalParameters.get(name);
+  }
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlTest.java?rev=788925&r1=788924&r2=788925&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/dynsql/DynSqlTest.java Sat Jun 27 06:06:24 2009
@@ -11,7 +11,6 @@
 import java.sql.*;
 import java.util.*;
 
-@Ignore
 public class DynSqlTest {
 
   protected static SqlSessionFactory sqlSessionFactory;