Author: cbegin
Date: Mon Sep 7 18:00:08 2009
New Revision: 812241
URL: http://svn.apache.org/viewvc?rev=812241&view=rev
Log:
re-implemented nested parameter creation
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
Modified:
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
URL:
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java?rev=812241&r1=812240&r2=812241&view=diff
==============================================================================
---
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
(original)
+++
ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/NewResultSetHandler.java
Mon Sep 7 18:00:08 2009
@@ -9,12 +9,12 @@
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.result.DefaultResultHandler;
import org.apache.ibatis.executor.result.ResultHandler;
-import org.apache.ibatis.executor.result.ResultContext;
import org.apache.ibatis.executor.result.DefaultResultContext;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
+import java.util.HashMap;
import java.sql.*;
public class NewResultSetHandler implements ResultSetHandler {
@@ -26,6 +26,7 @@
private final ResultHandler resultHandler;
private final BoundSql boundSql;
private final TypeHandlerRegistry typeHandlerRegistry;
+ private final ObjectFactory objectFactory;
public NewResultSetHandler(MappedStatement mappedStatement, ParameterHandler
parameterHandler, ResultHandler resultHandler, BoundSql boundSql, int offset,
int limit) {
this.configuration = mappedStatement.getConfiguration();
@@ -35,8 +36,13 @@
this.resultHandler = resultHandler;
this.boundSql = boundSql;
this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();
+ this.objectFactory = configuration.getObjectFactory();
}
+ //
+ // HANDLE OUTPUT PARAMETER
+ //
+
public void handleOutputParameters(CallableStatement cs) throws SQLException
{
final Object parameterObject = parameterHandler.getParameterObject();
final MetaObject metaParam = MetaObject.forObject(parameterObject);
@@ -45,7 +51,7 @@
final ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() == ParameterMode.OUT ||
parameterMapping.getMode() == ParameterMode.INOUT) {
if
("java.sql.ResultSet".equalsIgnoreCase(parameterMapping.getJavaType().getName()))
{
- handleResultSetOutputParameter(cs, parameterMapping, i, metaParam);
+ handleRefCursorOutputParameter(cs, parameterMapping, i, metaParam);
} else {
metaParam.setValue(parameterMapping.getProperty(),
parameterMapping.getTypeHandler().getResult(cs, i + 1));
}
@@ -53,7 +59,7 @@
}
}
- private void handleResultSetOutputParameter(CallableStatement cs,
ParameterMapping parameterMapping, int parameterMappingIndex, MetaObject
metaParam) throws SQLException {
+ private void handleRefCursorOutputParameter(CallableStatement cs,
ParameterMapping parameterMapping, int parameterMappingIndex, MetaObject
metaParam) throws SQLException {
final ResultSet rs = (ResultSet) cs.getObject(parameterMappingIndex + 1);
final String resultMapId = parameterMapping.getResultMapId();
if (resultMapId != null) {
@@ -67,6 +73,10 @@
rs.close();
}
+ //
+ // HANDLE RESULT SETS
+ //
+
public List handleResultSets(Statement stmt) throws SQLException {
final List multipleResults = new ArrayList();
final List<ResultMap> resultMaps = mappedStatement.getResultMaps();
@@ -124,11 +134,32 @@
}
}
+ private ResultSet getNextResultSet(Statement stmt) throws SQLException {
+ // Making this method tolerant of bad JDBC drivers
+ try {
+ if (stmt.getConnection().getMetaData().supportsMultipleResultSets()) {
+ // Crazy Standard JDBC way of determining if there are more results
+ if (!((!stmt.getMoreResults()) && (stmt.getUpdateCount() == -1))) {
+ return stmt.getResultSet();
+ }
+ }
+ } catch (Exception e) {
+ // Intentionally ignored.
+ }
+ return null;
+ }
+
+ //
+ // PROPERTY MAPPINGS
+ //
+
private void applyPropertyMappings(ResultSet rs, ResultMap resultMap,
List<String> mappedColumnNames, MetaObject metaObject) throws SQLException {
final List<ResultMapping> propertyMappings =
resultMap.getPropertyResultMappings();
for (ResultMapping propertyMapping : propertyMappings) {
final TypeHandler typeHandler = propertyMapping.getTypeHandler();
- if (typeHandler != null) {
+ if (propertyMapping.getNestedQueryId() != null) {
+
+ } else if (typeHandler != null) {
final String property = propertyMapping.getProperty();
final String column = propertyMapping.getColumn();
if (mappedColumnNames.contains(column.toUpperCase())) {
@@ -170,32 +201,89 @@
}
}
+ //
+ // INSTANTIATION & CONSTRUCTOR MAPPING
+ //
+
private Object createResultObject(ResultSet rs, ResultMap resultMap) throws
SQLException {
final Class resultType = resultMap.getType();
- final ObjectFactory objectFactory = configuration.getObjectFactory();
final List<ResultMapping> constructorMappings =
resultMap.getConstructorResultMappings();
if (typeHandlerRegistry.hasTypeHandler(resultType)) {
- final ResultSetMetaData rsmd = rs.getMetaData();
- final String columnName = configuration.isUseColumnLabel() ?
rsmd.getColumnLabel(1) : rsmd.getColumnName(1);
- final TypeHandler typeHandler =
typeHandlerRegistry.getTypeHandler(resultType);
- return typeHandler.getResult(rs,columnName);
+ return createPrimitiveResultObject(rs, resultType);
} else if (constructorMappings.size() > 0) {
- final List<Class> parameterTypes = new ArrayList<Class>();
- final List<Object> parameterValues = new ArrayList<Object>();
- for(ResultMapping constructorMapping : constructorMappings) {
- final Class parameterType = constructorMapping.getJavaType();
- final TypeHandler typeHandler = constructorMapping.getTypeHandler();
- final String column = constructorMapping.getColumn();
- final Object value = typeHandler.getResult(rs, column);
- parameterTypes.add(parameterType);
- parameterValues.add(value);
- }
- return objectFactory.create(resultType, parameterTypes, parameterValues);
+ return createParameterizedResultObject(rs, resultType,
constructorMappings);
} else {
return objectFactory.create(resultType);
}
}
+ private Object createParameterizedResultObject(ResultSet rs, Class
resultType, List<ResultMapping> constructorMappings) throws SQLException {
+ final List<Class> parameterTypes = new ArrayList<Class>();
+ final List<Object> parameterValues = new ArrayList<Object>();
+ for(ResultMapping constructorMapping : constructorMappings) {
+ final Class parameterType = constructorMapping.getJavaType();
+ final TypeHandler typeHandler = constructorMapping.getTypeHandler();
+ final String column = constructorMapping.getColumn();
+ final Object value = typeHandler.getResult(rs, column);
+ parameterTypes.add(parameterType);
+ parameterValues.add(value);
+ }
+ return objectFactory.create(resultType, parameterTypes, parameterValues);
+ }
+
+ private Object createPrimitiveResultObject(ResultSet rs, Class resultType)
throws SQLException {
+ final ResultSetMetaData rsmd = rs.getMetaData();
+ final String columnName = configuration.isUseColumnLabel() ?
rsmd.getColumnLabel(1) : rsmd.getColumnName(1);
+ final TypeHandler typeHandler =
typeHandlerRegistry.getTypeHandler(resultType);
+ return typeHandler.getResult(rs,columnName);
+ }
+
+ //
+ // NESTED QUERY
+ //
+
+ private Object prepareParameterForNestedQuery(ResultSet rs, ResultMapping
resultMapping, Class parameterType) throws SQLException {
+ if (resultMapping.isCompositeResult()) {
+ return prepareCompositeKeyParameter(rs, resultMapping, parameterType);
+ } else {
+ return prepareSimpleKeyParameter(rs, resultMapping, parameterType);
+ }
+ }
+
+ private Object prepareSimpleKeyParameter(ResultSet rs, ResultMapping
resultMapping, Class parameterType) throws SQLException {
+ final TypeHandler typeHandler;
+ if (typeHandlerRegistry.hasTypeHandler(parameterType)) {
+ typeHandler = typeHandlerRegistry.getTypeHandler(parameterType);
+ } else {
+ typeHandler = typeHandlerRegistry.getUnkownTypeHandler();
+ }
+ return typeHandler.getResult(rs, resultMapping.getColumn());
+ }
+
+ private Object prepareCompositeKeyParameter(ResultSet rs, ResultMapping
resultMapping, Class parameterType) throws SQLException {
+ final Object parameterObject = instantiateParameterObject(parameterType);
+ final MetaObject metaObject = MetaObject.forObject(parameterObject);
+ for (ResultMapping innerResultMapping : resultMapping.getComposites()) {
+ final Class propType =
metaObject.getSetterType(innerResultMapping.getProperty());
+ final TypeHandler typeHandler =
typeHandlerRegistry.getTypeHandler(propType);
+ final Object propValue = typeHandler.getResult(rs,
innerResultMapping.getColumn());
+ metaObject.setValue(innerResultMapping.getProperty(), propValue);
+ }
+ return parameterObject;
+ }
+
+ private Object instantiateParameterObject(Class parameterType) {
+ if (parameterType == null) {
+ return new HashMap();
+ } else {
+ return objectFactory.create(parameterType);
+ }
+ }
+
+ //
+ // DISCRIMINATOR
+ //
+
public ResultMap resolveDiscriminatedResultMap(ResultSet rs, ResultMap
resultMap) throws SQLException {
final Discriminator discriminator = resultMap.getDiscriminator();
if (discriminator != null) {
@@ -218,19 +306,4 @@
}
}
- private ResultSet getNextResultSet(Statement stmt) throws SQLException {
- // Making this method tolerant of bad JDBC drivers
- try {
- if (stmt.getConnection().getMetaData().supportsMultipleResultSets()) {
- // Crazy Standard JDBC way of determining if there are more results
- if (!((!stmt.getMoreResults()) && (stmt.getUpdateCount() == -1))) {
- return stmt.getResultSet();
- }
- }
- } catch (Exception e) {
- // Intentionally ignored.
- }
- return null;
- }
-
}