Author: cbegin
Date: Sun Aug 13 02:08:28 2006
New Revision: 431155
URL: http://svn.apache.org/viewvc?rev=431155&view=rev
Log:
Multiple ResultSet support complete.
Modified:
ibatis/trunk/java/mapper/mapper2/build/build.xml
ibatis/trunk/java/mapper/mapper2/build/version.properties
ibatis/trunk/java/mapper/mapper2/doc/release.txt
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java
Modified: ibatis/trunk/java/mapper/mapper2/build/build.xml
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/build.xml?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/build/build.xml (original)
+++ ibatis/trunk/java/mapper/mapper2/build/build.xml Sun Aug 13 02:08:28 2006
@@ -26,6 +26,7 @@
<target name="clean">
<delete dir="${deploy.path}"/>
<delete dir="${work.root}"/>
+ <delete dir="ibderby"/>
<delete dir="${reports.root}"/>
<delete>
<fileset dir="./">
Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/version.properties?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/build/version.properties (original)
+++ ibatis/trunk/java/mapper/mapper2/build/version.properties Sun Aug 13
02:08:28 2006
@@ -1,5 +1,5 @@
#Build version info
-#Wed Aug 02 15:24:03 CDT 2006
+#Sun Aug 13 02:50:18 MDT 2006
version=2.1.7
-buildDate=2006/08/02 15\:24
-buildNum=618
+buildDate=2006/08/13 02\:50
+buildNum=624
Modified: ibatis/trunk/java/mapper/mapper2/doc/release.txt
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/doc/release.txt?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/doc/release.txt (original)
+++ ibatis/trunk/java/mapper/mapper2/doc/release.txt Sun Aug 13 02:08:28 2006
@@ -9,6 +9,7 @@
o Removed deprectated JtaDaoTemplate
o Removed custom nested transactions (JDBC 1.4 now required)
o Added support for ResultSet OUT params from stored procs (e.g. Oracle Ref
Cursor)
+ o Added support for Multiple ResultSets mapped to corresponding ResultMaps or
ResultClasses.
o Fixed IBATIS-224 - isNotNull node causes typehandler mappings in statement
to fail
o Fixed IBATIS-249 - Race conditions in Throttle lead to thread blockage
popping items from ThrottledPools under stress
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
Sun Aug 13 02:08:28 2006
@@ -1,17 +1,7 @@
package com.ibatis.sqlmap.engine.builder.xml;
-import java.sql.ResultSet;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
import com.ibatis.common.beans.Probe;
import com.ibatis.common.beans.ProbeFactory;
-
import com.ibatis.common.resources.Resources;
import com.ibatis.common.xml.NodeletUtils;
import com.ibatis.sqlmap.client.SqlMapException;
@@ -24,18 +14,16 @@
import com.ibatis.sqlmap.engine.mapping.sql.Sql;
import com.ibatis.sqlmap.engine.mapping.sql.SqlText;
import com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.DynamicParent;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.IterateTagHandler;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTag;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTagHandler;
-import
com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTagHandlerFactory;
+import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.*;
import com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql;
import com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql;
-import com.ibatis.sqlmap.engine.mapping.statement.CachingStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.InsertStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.SelectKeyStatement;
+import com.ibatis.sqlmap.engine.mapping.statement.*;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.sql.ResultSet;
+import java.util.*;
public class SqlStatementParser extends BaseParser {
@@ -60,7 +48,7 @@
String parameterMapName =
applyNamespace(attributes.getProperty("parameterMap"));
String parameterClassName = attributes.getProperty("parameterClass");
- String resultMapName = applyNamespace(attributes.getProperty("resultMap"));
+ String resultMapName = attributes.getProperty("resultMap");
String resultClassName = attributes.getProperty("resultClass");
String cacheModelName =
applyNamespace(attributes.getProperty("cacheModel"));
String xmlResultName = attributes.getProperty("xmlResultName");
@@ -69,31 +57,32 @@
String allowRemapping = attributes.getProperty("remapResults");
String timeout = attributes.getProperty("timeout");
- vars.errorCtx.setObjectId(id + " statement");
+ String[] additionalResultMapNames;
+ List additionalResultMaps = new ArrayList();
- parameterClassName =
vars.typeHandlerFactory.resolveAlias(parameterClassName);
- resultClassName = vars.typeHandlerFactory.resolveAlias(resultClassName);
+ vars.errorCtx.setObjectId(id + " statement");
- Class parameterClass = null;
- Class resultClass = null;
// get parameter and result maps
vars.errorCtx.setMoreInfo("Check the result map name.");
- BasicResultMap resultMap = null;
+ //BasicResultMap resultMap = null;
if (resultMapName != null) {
- resultMap = (BasicResultMap)
vars.client.getDelegate().getResultMap(resultMapName);
+ additionalResultMapNames = getAllButFirstToken(resultMapName);
+ resultMapName = getFirstToken (resultMapName);
+ statement.setResultMap((BasicResultMap)
vars.client.getDelegate().getResultMap(applyNamespace(resultMapName)));
+ for (int i=0; i < additionalResultMapNames.length; i++) {
+ statement.addResultMap((BasicResultMap)
vars.client.getDelegate().getResultMap(applyNamespace(additionalResultMapNames[i])));
+ }
}
vars.errorCtx.setMoreInfo("Check the parameter map name.");
- BasicParameterMap parameterMap = null;
+
if (parameterMapName != null) {
- parameterMap = (BasicParameterMap)
vars.client.getDelegate().getParameterMap(parameterMapName);
+ statement.setParameterMap((BasicParameterMap)
vars.client.getDelegate().getParameterMap(parameterMapName));
}
statement.setId(id);
- statement.setParameterMap(parameterMap);
- statement.setResultMap(resultMap);
statement.setResource(vars.errorCtx.getResource());
if (resultSetType != null) {
@@ -111,11 +100,13 @@
}
// set parameter class either from attribute or from map (make sure to
match)
+ ParameterMap parameterMap = statement.getParameterMap();
if (parameterMap == null) {
try {
if (parameterClassName != null) {
vars.errorCtx.setMoreInfo("Check the parameter class.");
- parameterClass = Resources.classForName(parameterClassName);
+ parameterClassName =
vars.typeHandlerFactory.resolveAlias(parameterClassName);
+ Class parameterClass = Resources.classForName(parameterClassName);
statement.setParameterClass(parameterClass);
}
} catch (ClassNotFoundException e) {
@@ -125,32 +116,25 @@
statement.setParameterClass(parameterMap.getParameterClass());
}
- try {
- if (resultClassName != null) {
- vars.errorCtx.setMoreInfo("Check the result class.");
- resultClass = Resources.classForName(resultClassName);
- }
- } catch (ClassNotFoundException e) {
- throw new SqlMapException("Error. Could not set result class. Cause: "
+ e, e);
- }
-
// process SQL statement, including inline parameter maps
vars.errorCtx.setMoreInfo("Check the SQL statement.");
processSqlStatement(node, statement);
// set up either null result map or automatic result mapping
- if (resultMap == null && resultClass == null) {
+ BasicResultMap resultMap = (BasicResultMap)statement.getResultMap();
+ if (resultMap == null && resultClassName == null) {
statement.setResultMap(null);
} else if (resultMap == null) {
- resultMap = new AutoResultMap(vars.client.getDelegate(),
"true".equals(allowRemapping));
- resultMap.setId(statement.getId() + "-AutoResultMap");
- resultMap.setResultClass(resultClass);
- resultMap.setXmlName(xmlResultName);
- resultMap.setResource(statement.getResource());
+ String firstResultClass = getFirstToken(resultClassName);
+ resultMap = buildAutoResultMap(allowRemapping, statement,
firstResultClass, xmlResultName);
statement.setResultMap(resultMap);
-
+ String[] additionalResultClasses = getAllButFirstToken(resultClassName);
+ for (int i=0; i<additionalResultClasses.length; i++) {
+ statement.addResultMap(buildAutoResultMap(allowRemapping, statement,
additionalResultClasses[i],xmlResultName));
+ }
+
}
-
+
statement.setTimeout(vars.defaultStatementTimeout);
if (timeout != null) {
try {
@@ -174,6 +158,43 @@
}
+ private BasicResultMap buildAutoResultMap(String allowRemapping,
GeneralStatement statement, String firstResultClass, String xmlResultName) {
+ BasicResultMap resultMap;
+ resultMap = new AutoResultMap(vars.client.getDelegate(),
"true".equals(allowRemapping));
+ resultMap.setId(statement.getId() + "-AutoResultMap");
+ resultMap.setResultClass(resolveClass(firstResultClass));
+ resultMap.setXmlName(xmlResultName);
+ resultMap.setResource(statement.getResource());
+ return resultMap;
+ }
+
+ private Class resolveClass(String resultClassName) {
+ try {
+ if (resultClassName != null) {
+ vars.errorCtx.setMoreInfo("Check the result class.");
+ return
Resources.classForName(vars.typeHandlerFactory.resolveAlias(resultClassName));
+ } else {
+ return null;
+ }
+ } catch (ClassNotFoundException e) {
+ throw new SqlMapException("Error. Could not set result class. Cause: "
+ e, e);
+ }
+ }
+
+ private String getFirstToken (String s) {
+ return new StringTokenizer(s, ", ", false).nextToken();
+ }
+
+ private String[] getAllButFirstToken (String s) {
+ List strings = new ArrayList();
+ StringTokenizer parser = new StringTokenizer(s, ", ", false);
+ parser.nextToken();
+ while (parser.hasMoreTokens()) {
+ strings.add(parser.nextToken());
+ }
+ return (String[]) strings.toArray(new String[strings.size()]);
+ }
+
private void processSqlStatement(Node n, GeneralStatement statement) {
vars.errorCtx.setActivity("processing an SQL statement");
@@ -252,14 +273,14 @@
tag.setPrependAttr(attributes.getProperty("prepend"));
tag.setPropertyAttr(attributes.getProperty("property"));
tag.setRemoveFirstPrepend(attributes.getProperty("removeFirstPrepend"));
-
+
tag.setOpenAttr(attributes.getProperty("open"));
tag.setCloseAttr(attributes.getProperty("close"));
tag.setComparePropertyAttr(attributes.getProperty("compareProperty"));
tag.setCompareValueAttr(attributes.getProperty("compareValue"));
tag.setConjunctionAttr(attributes.getProperty("conjunction"));
-
+
// an iterate ancestor requires a post parse
if(dynamic instanceof SqlTag) {
@@ -275,7 +296,7 @@
}
dynamic.addChild(tag);
-
+
if (child.hasChildNodes()) {
isDynamic = parseDynamicTags(child, tag, sqlBuffer, isDynamic,
tag.isPostParseRequired());
}
@@ -342,7 +363,7 @@
selectKeyStatement.setId(insertStatement.getId() + "-SelectKey");
selectKeyStatement.setResource(vars.errorCtx.getResource());
selectKeyStatement.setKeyProperty(keyPropName);
-
+
// process the type (pre or post) attribute
boolean hasType;
String type = attributes.getProperty("type");
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
Sun Aug 13 02:08:28 2006
@@ -39,12 +39,10 @@
//
// Constants
//
-
/**
* Constant to let us know not to skip anything
*/
public static final int NO_SKIPPED_RESULTS = 0;
-
/**
* Constant to let us know to include all records
*/
@@ -57,57 +55,44 @@
/**
* Execute an update
*
- * @param request - the request scope
- * @param conn - the database connection
- * @param sql - the sql statement to execute
+ * @param request - the request scope
+ * @param conn - the database connection
+ * @param sql - the sql statement to execute
* @param parameters - the parameters for the sql statement
- *
* @return - the number of records changed
- *
* @throws SQLException - if the update fails
*/
- public int executeUpdate(RequestScope request, Connection conn, String sql,
Object[] parameters)
- throws SQLException {
+ public int executeUpdate(RequestScope request, Connection conn, String sql,
Object[] parameters) throws SQLException {
ErrorContext errorContext = request.getErrorContext();
errorContext.setActivity("executing update");
errorContext.setObjectId(sql);
-
PreparedStatement ps = null;
int rows = 0;
-
try {
errorContext.setMoreInfo("Check the SQL Statement (preparation
failed).");
ps = conn.prepareStatement(sql);
-
setStatementTimeout(request.getStatement(), ps);
-
errorContext.setMoreInfo("Check the parameters (set parameters
failed).");
request.getParameterMap().setParameters(request, ps, parameters);
-
errorContext.setMoreInfo("Check the statement (update failed).");
-
ps.execute();
rows = ps.getUpdateCount();
- }
- finally {
+ } finally {
closeStatement(ps);
}
-
return rows;
}
/**
* Adds a statement to a batch
*
- * @param request - the request scope
- * @param conn - the database connection
- * @param sql - the sql statement
+ * @param request - the request scope
+ * @param conn - the database connection
+ * @param sql - the sql statement
* @param parameters - the parameters for the statement
- *
* @throws SQLException - if the statement fails
*/
- public void addBatch(RequestScope request, Connection conn, String sql,
Object[] parameters)
- throws SQLException {
+ public void addBatch(RequestScope request, Connection conn, String sql,
Object[] parameters) throws SQLException {
Batch batch = (Batch) request.getSession().getBatch();
if (batch == null) {
batch = new Batch();
@@ -120,13 +105,10 @@
* Execute a batch of statements
*
* @param session - the session scope
- *
* @return - the number of rows impacted by the batch
- *
* @throws SQLException - if a statement fails
*/
- public int executeBatch(SessionScope session)
- throws SQLException {
+ public int executeBatch(SessionScope session) throws SQLException {
int rows = 0;
Batch batch = (Batch) session.getBatch();
if (batch != null) {
@@ -143,16 +125,14 @@
* Execute a batch of statements
*
* @param session - the session scope
- *
* @return - a List of BatchResult objects (may be null if no batch
- * has been initiated). There will be one BatchResult object in the
- * list for each sub-batch executed
- * @throws SQLException if a database access error occurs, or the drive
- * does not support batch statements
+ * has been initiated). There will be one BatchResult object in the
+ * list for each sub-batch executed
+ * @throws SQLException if a database access error occurs, or the drive
+ * does not support batch statements
* @throws BatchException if the driver throws BatchUpdateException
*/
- public List executeBatchDetailed(SessionScope session)
- throws SQLException, BatchException {
+ public List executeBatchDetailed(SessionScope session) throws SQLException,
BatchException {
List answer = null;
Batch batch = (Batch) session.getBatch();
if (batch != null) {
@@ -164,63 +144,47 @@
}
return answer;
}
-
+
/**
* Long form of the method to execute a query
*
- * @param request - the request scope
- * @param conn - the database connection
- * @param sql - the SQL statement to execute
- * @param parameters - the parameters for the statement
+ * @param request - the request scope
+ * @param conn - the database connection
+ * @param sql - the SQL statement to execute
+ * @param parameters - the parameters for the statement
* @param skipResults - the number of results to skip
- * @param maxResults - the maximum number of results to return
- * @param callback - the row handler for the query
- *
+ * @param maxResults - the maximum number of results to return
+ * @param callback - the row handler for the query
* @throws SQLException - if the query fails
*/
- public void executeQuery(RequestScope request, Connection conn, String sql,
Object[] parameters,
- int skipResults, int maxResults, RowHandlerCallback
callback)
- throws SQLException {
+ public void executeQuery(RequestScope request, Connection conn, String sql,
Object[] parameters, int skipResults, int maxResults, RowHandlerCallback
callback) throws SQLException {
ErrorContext errorContext = request.getErrorContext();
errorContext.setActivity("executing query");
errorContext.setObjectId(sql);
-
PreparedStatement ps = null;
ResultSet rs = null;
-
try {
errorContext.setMoreInfo("Check the SQL Statement (preparation
failed).");
-
Integer rsType = request.getStatement().getResultSetType();
if (rsType != null) {
ps = conn.prepareStatement(sql, rsType.intValue(),
ResultSet.CONCUR_READ_ONLY);
} else {
ps = conn.prepareStatement(sql);
}
-
setStatementTimeout(request.getStatement(), ps);
-
Integer fetchSize = request.getStatement().getFetchSize();
if (fetchSize != null) {
ps.setFetchSize(fetchSize.intValue());
}
-
errorContext.setMoreInfo("Check the parameters (set parameters
failed).");
request.getParameterMap().setParameters(request, ps, parameters);
-
errorContext.setMoreInfo("Check the statement (query failed).");
-
ps.execute();
- rs = getFirstResultSet(ps);
-
- if (rs != null) {
- errorContext.setMoreInfo("Check the results (failed to retrieve
results).");
- handleResults(request, rs, skipResults, maxResults, callback);
- }
-
- // clear out remaining results
- while (getMoreResults(ps));
+ errorContext.setMoreInfo("Check the results (failed to retrieve
results).");
+ // Begin ResultSet Handling
+ rs = handleMultipleResults(ps, request, skipResults, maxResults,
callback);
+ // End ResultSet Handling
} finally {
try {
closeResultSet(rs);
@@ -234,113 +198,86 @@
/**
* Execute a stored procedure that updates data
*
- * @param request - the request scope
- * @param conn - the database connection
- * @param sql - the SQL to call the procedure
+ * @param request - the request scope
+ * @param conn - the database connection
+ * @param sql - the SQL to call the procedure
* @param parameters - the parameters for the procedure
- *
* @return - the rows impacted by the procedure
- *
* @throws SQLException - if the procedure fails
*/
- public int executeUpdateProcedure(RequestScope request, Connection conn,
String sql, Object[] parameters)
- throws SQLException {
+ public int executeUpdateProcedure(RequestScope request, Connection conn,
String sql, Object[] parameters) throws SQLException {
ErrorContext errorContext = request.getErrorContext();
errorContext.setActivity("executing update procedure");
errorContext.setObjectId(sql);
-
CallableStatement cs = null;
int rows = 0;
-
try {
errorContext.setMoreInfo("Check the SQL Statement (preparation
failed).");
cs = conn.prepareCall(sql);
-
setStatementTimeout(request.getStatement(), cs);
-
ParameterMap parameterMap = request.getParameterMap();
-
ParameterMapping[] mappings = parameterMap.getParameterMappings();
-
errorContext.setMoreInfo("Check the output parameters (register output
parameters failed).");
registerOutputParameters(cs, mappings);
-
errorContext.setMoreInfo("Check the parameters (set parameters
failed).");
parameterMap.setParameters(request, cs, parameters);
-
errorContext.setMoreInfo("Check the statement (update procedure
failed).");
-
cs.execute();
rows = cs.getUpdateCount();
-
errorContext.setMoreInfo("Check the output parameters (retrieval of
output parameters failed).");
retrieveOutputParameters(request, cs, mappings, parameters, null);
} finally {
closeStatement(cs);
}
-
return rows;
}
/**
* Execute a stored procedure
*
- * @param request - the request scope
- * @param conn - the database connection
- * @param sql - the sql to call the procedure
- * @param parameters - the parameters for the procedure
+ * @param request - the request scope
+ * @param conn - the database connection
+ * @param sql - the sql to call the procedure
+ * @param parameters - the parameters for the procedure
* @param skipResults - the number of results to skip
- * @param maxResults - the maximum number of results to return
- * @param callback - a row handler for processing the results
- *
+ * @param maxResults - the maximum number of results to return
+ * @param callback - a row handler for processing the results
* @throws SQLException - if the procedure fails
*/
- public void executeQueryProcedure(RequestScope request, Connection conn,
String sql, Object[] parameters,
- int skipResults, int maxResults,
RowHandlerCallback callback)
- throws SQLException {
+ public void executeQueryProcedure(RequestScope request, Connection conn,
String sql, Object[] parameters, int skipResults, int maxResults,
RowHandlerCallback callback) throws SQLException {
ErrorContext errorContext = request.getErrorContext();
errorContext.setActivity("executing query procedure");
errorContext.setObjectId(sql);
-
CallableStatement cs = null;
ResultSet rs = null;
-
try {
errorContext.setMoreInfo("Check the SQL Statement (preparation
failed).");
- cs = conn.prepareCall(sql);
-
+ Integer rsType = request.getStatement().getResultSetType();
+ if (rsType != null) {
+ cs = conn.prepareCall(sql, rsType.intValue(),
ResultSet.CONCUR_READ_ONLY);
+ } else {
+ cs = conn.prepareCall(sql);
+ }
setStatementTimeout(request.getStatement(), cs);
-
Integer fetchSize = request.getStatement().getFetchSize();
if (fetchSize != null) {
cs.setFetchSize(fetchSize.intValue());
}
-
ParameterMap parameterMap = request.getParameterMap();
-
ParameterMapping[] mappings = parameterMap.getParameterMappings();
-
errorContext.setMoreInfo("Check the output parameters (register output
parameters failed).");
registerOutputParameters(cs, mappings);
-
errorContext.setMoreInfo("Check the parameters (set parameters
failed).");
parameterMap.setParameters(request, cs, parameters);
-
errorContext.setMoreInfo("Check the statement (update procedure
failed).");
-
cs.execute();
- rs = getFirstResultSet(cs);
-
- if (rs != null) {
- errorContext.setMoreInfo("Check the results (failed to retrieve
results).");
- handleResults(request, rs, skipResults, maxResults, callback);
- }
-
- // consume additional results
- while (getMoreResults(cs));
+ errorContext.setMoreInfo("Check the results (failed to retrieve
results).");
+ // Begin ResultSet Handling
+ rs = handleMultipleResults(cs, request, skipResults, maxResults,
callback);
+ // End ResultSet Handling
errorContext.setMoreInfo("Check the output parameters (retrieval of
output parameters failed).");
- retrieveOutputParameters( request, cs, mappings, parameters, callback);
+ retrieveOutputParameters(request, cs, mappings, parameters, callback);
} finally {
try {
@@ -349,7 +286,42 @@
closeStatement(cs);
}
}
+ }
+
+ private ResultSet handleMultipleResults(PreparedStatement ps, RequestScope
request, int skipResults, int maxResults, RowHandlerCallback callback) throws
SQLException {
+ ResultSet rs;
+ rs = getFirstResultSet(ps);
+ if (rs != null) {
+ handleResults(request, rs, skipResults, maxResults, callback);
+ }
+ // Multiple ResultSet handling
+ if (callback.getRowHandler() instanceof DefaultRowHandler) {
+ MappedStatement statement = request.getStatement();
+ DefaultRowHandler defaultRowHandler = ((DefaultRowHandler)
callback.getRowHandler());
+ if (statement.hasMultipleResultMaps()) {
+ List multipleResults = new ArrayList();
+ multipleResults.add(defaultRowHandler.getList());
+ ResultMap[] resultMaps = statement.getAdditionalResultMaps();
+ int i = 0;
+ while (moveToNextResultsSafely(ps)) {
+ if (i >= resultMaps.length) break;
+ ResultMap rm = resultMaps[i];
+ request.setResultMap(rm);
+ rs = ps.getResultSet();
+ DefaultRowHandler rh = new DefaultRowHandler();
+ handleResults(request, rs, skipResults, maxResults, new
RowHandlerCallback(rm, null, rh));
+ multipleResults.add(rh.getList());
+ i++;
+ }
+ defaultRowHandler.setList(multipleResults);
+ request.setResultMap(statement.getResultMap());
+ } else {
+ while (moveToNextResultsSafely(ps)) ;
+ }
+ }
+ // End additional ResultSet handling
+ return rs;
}
private ResultSet getFirstResultSet(Statement stmt) throws SQLException {
@@ -360,62 +332,78 @@
if (rs != null) {
break;
}
- hasMoreResults = moveToNextResultSet(stmt);
+ hasMoreResults = moveToNextResultsIfPresent(stmt);
}
return rs;
}
- private boolean moveToNextResultSet(Statement stmt) throws SQLException {
+ private boolean moveToNextResultsIfPresent(Statement stmt) throws
SQLException {
boolean moreResults;
// This is the messed up JDBC approach for determining if there are more
results
- moreResults = !(((getMoreResults(stmt) == false) && (stmt.getUpdateCount()
== -1)));
+ moreResults = !(((moveToNextResultsSafely(stmt) == false) &&
(stmt.getUpdateCount() == -1)));
return moreResults;
}
- /**
- * Clean up any batches on the session
- *
- * @param session - the session to clean up
- */
- public void cleanup(SessionScope session) {
- Batch batch = (Batch) session.getBatch();
- if (batch != null) {
- batch.cleanupBatch();
- session.setBatch(null);
- }
- }
-
- private boolean getMoreResults(Statement stmt) throws SQLException {
+ private boolean moveToNextResultsSafely(Statement stmt) throws SQLException {
if (!stmt.getConnection().getMetaData().supportsMultipleResultSets()) {
return false;
}
return stmt.getMoreResults();
}
+ private void handleResults(RequestScope request, ResultSet rs, int
skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
+ try {
+ request.setResultSet(rs);
+ ResultMap resultMap = request.getResultMap();
+ if (resultMap != null) {
+ // Skip Results
+ if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
+ if (skipResults > 0) {
+ rs.absolute(skipResults);
+ }
+ } else {
+ for (int i = 0; i < skipResults; i++) {
+ if (!rs.next()) {
+ return;
+ }
+ }
+ }
+
+ // Get Results
+ int resultsFetched = 0;
+ while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched
< maxResults) && rs.next()) {
+ Object[] columnValues = resultMap.resolveSubMap(request,
rs).getResults(request, rs);
+ callback.handleResultObject(request, columnValues, rs);
+ resultsFetched++;
+ }
+ }
+ } finally {
+ request.setResultSet(null);
+ }
+ }
+
private void retrieveOutputParameters(RequestScope request,
CallableStatement cs, ParameterMapping[] mappings, Object[] parameters,
RowHandlerCallback callback) throws SQLException {
for (int i = 0; i < mappings.length; i++) {
BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]);
if (mapping.isOutputAllowed()) {
- if (
"java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName()) ) {
- ResultSet rs = (ResultSet) cs.getObject( i + 1 );
- ResultMap resultMap;
- if ( mapping.getResultMapName() == null ) {
- resultMap = request.getResultMap();
- handleResults(request, resultMap, rs, callback);
- }
- else {
- ExtendedSqlMapClient client =
(ExtendedSqlMapClient)request.getSession().getSqlMapClient();
- resultMap = client.getDelegate().getResultMap(
mapping.getResultMapName() );
- DefaultRowHandler rowHandler = new DefaultRowHandler();
- RowHandlerCallback handlerCallback = new
RowHandlerCallback(resultMap, null, rowHandler);
- handleResults(request, resultMap, rs, handlerCallback);
- parameters[i] = rowHandler.getList();
- }
- rs.close();
- }
- else {
- parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1);
- }
+ if ("java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName())) {
+ ResultSet rs = (ResultSet) cs.getObject(i + 1);
+ ResultMap resultMap;
+ if (mapping.getResultMapName() == null) {
+ resultMap = request.getResultMap();
+ handleOutputParameterResults(request, resultMap, rs, callback);
+ } else {
+ ExtendedSqlMapClient client = (ExtendedSqlMapClient)
request.getSession().getSqlMapClient();
+ resultMap =
client.getDelegate().getResultMap(mapping.getResultMapName());
+ DefaultRowHandler rowHandler = new DefaultRowHandler();
+ RowHandlerCallback handlerCallback = new
RowHandlerCallback(resultMap, null, rowHandler);
+ handleOutputParameterResults(request, resultMap, rs,
handlerCallback);
+ parameters[i] = rowHandler.getList();
+ }
+ rs.close();
+ } else {
+ parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1);
+ }
}
}
}
@@ -424,11 +412,11 @@
for (int i = 0; i < mappings.length; i++) {
BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]);
if (mapping.isOutputAllowed()) {
- if ( null != mapping.getTypeName() &&
!mapping.getTypeName().equals("") ) { //@added
- cs.registerOutParameter(i + 1, mapping.getJdbcType(),
mapping.getTypeName() );
+ if (null != mapping.getTypeName() &&
!mapping.getTypeName().equals("")) { //@added
+ cs.registerOutParameter(i + 1, mapping.getJdbcType(),
mapping.getTypeName());
} else {
- if (mapping.getNumericScale() != null
- && (mapping.getJdbcType() == Types.NUMERIC ||
mapping.getJdbcType() == Types.DECIMAL)) {
+ if (mapping.getNumericScale() != null && (mapping.getJdbcType() ==
Types.NUMERIC || mapping.getJdbcType() == Types.DECIMAL))
+ {
cs.registerOutParameter(i + 1, mapping.getJdbcType(),
mapping.getNumericScale().intValue());
} else {
cs.registerOutParameter(i + 1, mapping.getJdbcType());
@@ -438,13 +426,12 @@
}
}
- private void handleResults(RequestScope request, ResultMap resultMap,
ResultSet rs, RowHandlerCallback callback) throws SQLException {
- ResultMap orig = request.getResultMap();
+ private void handleOutputParameterResults(RequestScope request, ResultMap
resultMap, ResultSet rs, RowHandlerCallback callback) throws SQLException {
+ ResultMap orig = request.getResultMap();
try {
request.setResultSet(rs);
if (resultMap != null) {
- request.setResultMap( resultMap );
-
+ request.setResultMap(resultMap);
// Get Results
while (rs.next()) {
@@ -458,34 +445,16 @@
}
}
- private void handleResults(RequestScope request, ResultSet rs, int
skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
- try {
- request.setResultSet(rs);
- ResultMap resultMap = request.getResultMap();
- if (resultMap != null) {
- // Skip Results
- if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
- if (skipResults > 0) {
- rs.absolute(skipResults);
- }
- } else {
- for (int i = 0; i < skipResults; i++) {
- if (!rs.next()) {
- return;
- }
- }
- }
-
- // Get Results
- int resultsFetched = 0;
- while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched
< maxResults) && rs.next()) {
- Object[] columnValues = resultMap.resolveSubMap(request,
rs).getResults(request, rs);
- callback.handleResultObject(request, columnValues, rs);
- resultsFetched++;
- }
- }
- } finally {
- request.setResultSet(null);
+ /**
+ * Clean up any batches on the session
+ *
+ * @param session - the session to clean up
+ */
+ public void cleanup(SessionScope session) {
+ Batch batch = (Batch) session.getBatch();
+ if (batch != null) {
+ batch.cleanupBatch();
+ session.setBatch(null);
}
}
@@ -514,9 +483,8 @@
}
}
}
-
- private static void setStatementTimeout(MappedStatement mappedStatement,
- Statement statement) throws SQLException {
+
+ private static void setStatementTimeout(MappedStatement mappedStatement,
Statement statement) throws SQLException {
if (mappedStatement.getTimeout() != null) {
statement.setQueryTimeout(mappedStatement.getTimeout().intValue());
} else {
@@ -553,25 +521,20 @@
/**
* Add a prepared statement to the batch
*
- * @param request - the request scope
- * @param conn - the database connection
- * @param sql - the SQL to add
+ * @param request - the request scope
+ * @param conn - the database connection
+ * @param sql - the SQL to add
* @param parameters - the parameters for the SQL
- *
* @throws SQLException - if the prepare for the SQL fails
*/
public void addBatch(RequestScope request, Connection conn, String sql,
Object[] parameters) throws SQLException {
PreparedStatement ps = null;
- if (currentSql != null
- && sql.hashCode() == currentSql.hashCode()
- && sql.length() == currentSql.length()) {
+ if (currentSql != null && sql.hashCode() == currentSql.hashCode() &&
sql.length() == currentSql.length()) {
int last = statementList.size() - 1;
ps = (PreparedStatement) statementList.get(last);
} else {
ps = conn.prepareStatement(sql);
-
setStatementTimeout(request.getStatement(), ps);
-
currentSql = sql;
statementList.add(ps);
batchResultList.add(new BatchResult(request.getStatement().getId(),
sql));
@@ -583,13 +546,12 @@
/**
* TODO (Jeff Butler) - maybe this method should be deprecated in some
release,
- * and then removed in some even later release. executeBatchDetailed
gives
- * much more complete information.
- *
+ * and then removed in some even later release. executeBatchDetailed gives
+ * much more complete information.
+ * <p/>
* Execute the current session's batch
*
* @return - the number of rows updated
- *
* @throws SQLException - if the batch fails
*/
public int executeBatch() throws SQLException {
@@ -613,17 +575,16 @@
/**
* Batch execution method that returns all the information
* the driver has to offer.
- *
+ *
* @return a List of BatchResult objects
* @throws BatchException (an SQLException sub class) if any nested
- * batch fails
- * @throws SQLException if a database access error occurs, or the drive
- * does not support batch statements
+ * batch fails
+ * @throws SQLException if a database access error occurs, or the drive
+ * does not support batch statements
* @throws BatchException if the driver throws BatchUpdateException
*/
public List executeBatchDetailed() throws SQLException, BatchException {
List answer = new ArrayList();
-
for (int i = 0, n = statementList.size(); i < n; i++) {
BatchResult br = (BatchResult) batchResultList.get(i);
PreparedStatement ps = (PreparedStatement) statementList.get(i);
@@ -639,15 +600,13 @@
message.append(i);
message.append(" prior sub batch(s) completed successfully, but
will be rolled back.");
}
-
throw new BatchException(message.toString(), e, answer,
br.getStatementId(), br.getSql());
}
answer.add(br);
}
-
return answer;
}
-
+
/**
* Close all the statements in the batch and clear all the statements
*/
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
Sun Aug 13 02:08:28 2006
@@ -83,4 +83,5 @@
public ResultMap resolveSubMap (RequestScope request, ResultSet rs) throws
SQLException;
public Discriminator getDiscriminator();
+
}
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
Sun Aug 13 02:08:28 2006
@@ -26,6 +26,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Arrays;
public abstract class BaseStatement implements MappedStatement {
@@ -39,6 +40,7 @@
private int baseCacheKey;
private ExtendedSqlMapClient sqlMapClient;
private Integer timeout;
+ private ResultMap[] additionalResultMaps = new ResultMap[0];
private List executeListeners = new ArrayList();
@@ -158,5 +160,21 @@
public void setTimeout(Integer timeout) {
this.timeout = timeout;
}
+
+ public void addResultMap(ResultMap resultMap) {
+ List resultMapList = Arrays.asList(additionalResultMaps);
+ resultMapList = new ArrayList(resultMapList);
+ resultMapList.add(resultMap);
+ additionalResultMaps = (ResultMap[])resultMapList.toArray(new
ResultMap[resultMapList.size()]);
+ }
+
+ public boolean hasMultipleResultMaps() {
+ return additionalResultMaps.length > 0;
+ }
+
+ public ResultMap[] getAdditionalResultMaps() {
+ return additionalResultMaps;
+ }
+
}
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
Sun Aug 13 02:08:28 2006
@@ -143,4 +143,12 @@
return statement.getTimeout();
}
+ public boolean hasMultipleResultMaps() {
+ return statement.hasMultipleResultMaps();
+ }
+
+ public ResultMap[] getAdditionalResultMaps() {
+ return statement.getAdditionalResultMaps();
+ }
+
}
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
Sun Aug 13 02:08:28 2006
@@ -32,4 +32,8 @@
return list;
}
+ public void setList(List list) {
+ this.list = list;
+ }
+
}
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
Sun Aug 13 02:08:28 2006
@@ -68,4 +68,8 @@
public Integer getTimeout();
+ public boolean hasMultipleResultMaps();
+
+ public ResultMap[] getAdditionalResultMaps();
+
}
Modified:
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
Sun Aug 13 02:08:28 2006
@@ -98,5 +98,8 @@
return s;
}
+ public RowHandler getRowHandler() {
+ return rowHandler;
+ }
}
Modified:
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java
Sun Aug 13 02:08:28 2006
@@ -5,6 +5,9 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.sql.Connection;
+import java.sql.CallableStatement;
+import java.sql.ResultSet;
public class MultiResultSetTest extends BaseSqlMapTest {
@@ -17,22 +20,49 @@
}
- /**
- * This test should return 2 lists of 2 accounts each
- */
- public void testShouldRetrieveTwoSetsOfTwoAccountsFromMultipleResultSets() {
+ public void testShouldRetrieveTwoSetsOfTwoAccountsFromMultipleResultMaps()
throws Exception {
Map persons = new HashMap();
- persons.put("accountId1", new Integer(1));
- persons.put("accountId2", new Integer(2));
- persons.put("accountId3", new Integer(3));
- persons.put("accountId4", new Integer(4));
- try {
- List results = sqlMap.queryForList("getMultiListsRm", persons);
- assertEquals(2, results.size());
+ persons.put("1", new Integer(1));
+ persons.put("2", new Integer(2));
+ persons.put("3", new Integer(3));
+ persons.put("4", new Integer(4));
+ List results = sqlMap.queryForList("getMultiListsRm", persons);
+ assertEquals(2, results.size());
+ assertEquals(2, ((List) results.get(0)).size());
+ assertEquals(2, ((List) results.get(1)).size());
+ }
+
+ public void
testShouldRetrieveTwoSetsOfTwoAccountsFromMultipleResultClasses() throws
Exception {
+ Map persons = new HashMap();
+ persons.put("1", new Integer(1));
+ persons.put("2", new Integer(2));
+ persons.put("3", new Integer(3));
+ persons.put("4", new Integer(4));
+ List results = sqlMap.queryForList("getMultiListsRc", persons);
+ assertEquals(2, results.size());
+ assertEquals(2, ((List) results.get(0)).size());
+ assertEquals(2, ((List) results.get(1)).size());
+ }
- } catch (Exception e) {
- fail(e.getMessage());
+ public void testCallableStatementShouldReturnTwoResultSets() throws
Exception {
+ sqlMap.startTransaction();
+ Connection conn = sqlMap.getCurrentConnection();
+ CallableStatement cs = conn.prepareCall("{call MRESULTSET(?,?,?,?)}");
+ cs.setInt(1, 1);
+ cs.setInt(2, 2);
+ cs.setInt(3, 3);
+ cs.setInt(4, 4);
+ cs.execute();
+ ResultSet rs = cs.getResultSet();
+ assertNotNull(rs);
+ int found = 1;
+ while (cs.getMoreResults()) {
+ assertNotNull(cs.getResultSet());
+ found++;
}
+ rs.close();
+ cs.close();
+ assertEquals("Didn't find second result set.", 2, found);
}
Modified:
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml
(original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml
Sun Aug 13 02:08:28 2006
@@ -7,13 +7,6 @@
<sqlMap namespace="DerbyProc">
<typeAlias alias="account" type="testdomain.Account"/>
-
- <parameterMap id="multiList" class="map" >
- <parameter property="accountId1" jdbcType="INTEGER"
javaType="java.lang.Integer" mode="IN"/>
- <parameter property="accountId2" jdbcType="INTEGER"
javaType="java.lang.Integer" mode="IN"/>
- <parameter property="accountId3" jdbcType="INTEGER"
javaType="java.lang.Integer" mode="IN"/>
- <parameter property="accountId4" jdbcType="INTEGER"
javaType="java.lang.Integer" mode="IN"/>
- </parameterMap>
<resultMap id="account-result" class="account">
<result property="id" column="ACC_ID" columnIndex="1"/>
@@ -24,11 +17,11 @@
<!-- <parameter property="accountList" javaType="list" mode="OUT"/> -->
<!-- <parameter property="accountList" javaType="list" mode="OUT"/> -->
- <procedure id="getMultiListsRm" parameterMap="multiList"
resultMap="account-result">
- {call MRESULTSET(?,?,?,?)}
+ <procedure id="getMultiListsRm" parameterClass="hashmap"
resultMap="account-result, account-result">
+ {call MRESULTSET(#1#,#2#,#3#,#4#)}
</procedure>
- <procedure id="getMultiListsRc" parameterMap="multiList"
resultClass="account">
- {call MRESULTSET(?,?,?,?)}
+ <procedure id="getMultiListsRc" parameterClass="hashmap"
resultClass="account, account">
+ {call MRESULTSET(#1#,#2#,#3#,#4#)}
</procedure>
</sqlMap>
Modified:
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
---
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java
(original)
+++
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java
Sun Aug 13 02:08:28 2006
@@ -16,7 +16,7 @@
PreparedStatement ps2 = conn.prepareStatement("select * from account where
acc_id in (?,?)");
ps2.setInt(1, p3);
ps2.setInt(2, p4);
- rs1[0] = ps2.executeQuery();
+ rs2[0] = ps2.executeQuery();
conn.close();
}