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;