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 2007/06/16 05:53:31 UTC

svn commit: r547856 [2/2] - in /ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine: conifg/ exchange/ execution/ impl/ mapping/result/ mapping/result/loader/ mapping/statement/

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?view=diff&rev=547856&r1=547855&r2=547856
==============================================================================
--- 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 Fri Jun 15 20:53:30 2007
@@ -1,391 +1,391 @@
-/*
- *  Copyright 2004 Clinton Begin
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package com.ibatis.sqlmap.engine.mapping.statement;
-
-import com.ibatis.common.jdbc.exception.NestedSQLException;
-import com.ibatis.common.io.ReaderInputStream;
-
-import com.ibatis.sqlmap.client.event.RowHandler;
-import com.ibatis.sqlmap.client.*;
-import com.ibatis.sqlmap.engine.execution.SqlExecutor;
-import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
-import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
-import com.ibatis.sqlmap.engine.mapping.sql.Sql;
-import com.ibatis.sqlmap.engine.scope.ErrorContext;
-import com.ibatis.sqlmap.engine.scope.StatementScope;
-import com.ibatis.sqlmap.engine.transaction.Transaction;
-import com.ibatis.sqlmap.engine.transaction.TransactionException;
-import com.ibatis.sqlmap.engine.type.*;
-import com.ibatis.sqlmap.engine.cache.*;
-import com.ibatis.sqlmap.engine.impl.*;
-import org.w3c.dom.Document;
-
-import javax.xml.parsers.*;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.*;
-import java.io.*;
-
-public class MappedStatement {
-  private String id;
-  private Integer resultSetType;
-  private Integer fetchSize;
-  private ResultMap resultMap;
-  private ParameterMap parameterMap;
-  private Class parameterClass;
-  private Sql sql;
-  private int baseCacheKey;
-  private ExtendedSqlMapClient sqlMapClient;
-  private Integer timeout;
-  private ResultMap[] additionalResultMaps = new ResultMap[0];
-  private List executeListeners = new ArrayList();
-  private String resource;
-
-  public StatementType getStatementType() {
-    return StatementType.UNKNOWN;
-  }
-
-  public int executeUpdate(StatementScope statementScope, Transaction trans, Object parameterObject)
-      throws SQLException {
-    ErrorContext errorContext = statementScope.getErrorContext();
-    errorContext.setActivity("preparing the mapped statement for execution");
-    errorContext.setObjectId(this.getId());
-    errorContext.setResource(this.getResource());
-
-    statementScope.getSession().setCommitRequired(true);
-
-    try {
-      parameterObject = validateParameter(parameterObject);
-
-      Sql sql = getSql();
-
-      errorContext.setMoreInfo("Check the parameter map.");
-      ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject);
-
-      errorContext.setMoreInfo("Check the result map.");
-      ResultMap resultMap = sql.getResultMap(statementScope, parameterObject);
-
-      statementScope.setResultMap(resultMap);
-      statementScope.setParameterMap(parameterMap);
-
-      int rows = 0;
-
-      errorContext.setMoreInfo("Check the parameter map.");
-      Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject);
-
-      errorContext.setMoreInfo("Check the SQL statement.");
-      String sqlString = sql.getSql(statementScope, parameterObject);
-
-      errorContext.setActivity("executing mapped statement");
-      errorContext.setMoreInfo("Check the statement or the result map.");
-      rows = sqlExecuteUpdate(statementScope, trans.getConnection(), sqlString, parameters);
-
-      errorContext.setMoreInfo("Check the output parameters.");
-      if (parameterObject != null) {
-        postProcessParameterObject(statementScope, parameterObject, parameters);
-      }
-
-      errorContext.reset();
-      sql.cleanup(statementScope);
-      notifyListeners();
-      return rows;
-    } catch (SQLException e) {
-      errorContext.setCause(e);
-      throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e);
-    } catch (Exception e) {
-      errorContext.setCause(e);
-      throw new NestedSQLException(errorContext.toString(), e);
-    }
-  }
-
-  public Object executeQueryForObject(StatementScope statementScope, Transaction trans, Object parameterObject, Object resultObject)
-      throws SQLException {
-    try {
-      Object object = null;
-
-      DefaultRowHandler rowHandler = new DefaultRowHandler();
-      executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, resultObject, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);
-      List list = rowHandler.getList();
-
-      if (list.size() > 1) {
-        throw new SQLException("Error: executeQueryForObject returned too many results.");
-      } else if (list.size() > 0) {
-        object = list.get(0);
-      }
-
-      return object;
-    } catch (TransactionException e) {
-      throw new NestedSQLException("Error getting Connection from Transaction.  Cause: " + e, e);
-    }
-  }
-
-  public List executeQueryForList(StatementScope statementScope, Transaction trans, Object parameterObject, int skipResults, int maxResults)
-      throws SQLException {
-    try {
-      DefaultRowHandler rowHandler = new DefaultRowHandler();
-      executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, skipResults, maxResults);
-      return rowHandler.getList();
-    } catch (TransactionException e) {
-      throw new NestedSQLException("Error getting Connection from Transaction.  Cause: " + e, e);
-    }
-  }
-
-  public void executeQueryWithRowHandler(StatementScope statementScope, Transaction trans, Object parameterObject, RowHandler rowHandler)
-      throws SQLException {
-    try {
-      executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);
-    } catch (TransactionException e) {
-      throw new NestedSQLException("Error getting Connection from Transaction.  Cause: " + e, e);
-    }
-  }
-
-  //
-  //  PROTECTED METHODS
-  //
-
-  protected void executeQueryWithCallback(StatementScope statementScope, Connection conn, Object parameterObject, Object resultObject, RowHandler rowHandler, int skipResults, int maxResults)
-      throws SQLException {
-    ErrorContext errorContext = statementScope.getErrorContext();
-    errorContext.setActivity("preparing the mapped statement for execution");
-    errorContext.setObjectId(this.getId());
-    errorContext.setResource(this.getResource());
-
-    try {
-      parameterObject = validateParameter(parameterObject);
-
-      Sql sql = getSql();
-
-      errorContext.setMoreInfo("Check the parameter map.");
-      ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject);
-
-      errorContext.setMoreInfo("Check the result map.");
-      ResultMap resultMap = sql.getResultMap(statementScope, parameterObject);
-
-      statementScope.setResultMap(resultMap);
-      statementScope.setParameterMap(parameterMap);
-
-      errorContext.setMoreInfo("Check the parameter map.");
-      Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject);
-
-      errorContext.setMoreInfo("Check the SQL statement.");
-      String sqlString = sql.getSql(statementScope, parameterObject);
-
-      errorContext.setActivity("executing mapped statement");
-      errorContext.setMoreInfo("Check the SQL statement or the result map.");
-      RowHandlerCallback callback = new RowHandlerCallback(resultMap, resultObject, rowHandler);
-      sqlExecuteQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback);
-
-      errorContext.setMoreInfo("Check the output parameters.");
-      if (parameterObject != null) {
-        postProcessParameterObject(statementScope, parameterObject, parameters);
-      }
-
-      errorContext.reset();
-      sql.cleanup(statementScope);
-      notifyListeners();
-    } catch (SQLException e) {
-      errorContext.setCause(e);
-      throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e);
-    } catch (Exception e) {
-      errorContext.setCause(e);
-      throw new NestedSQLException(errorContext.toString(), e);
-    }
-  }
-
-  protected void postProcessParameterObject(StatementScope statementScope, Object parameterObject, Object[] parameters) {
-  }
-
-  protected int sqlExecuteUpdate(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters) throws SQLException {
-    if (statementScope.getSession().isInBatch()) {
-      getSqlExecutor().addBatch(statementScope, conn, sqlString, parameters);
-      return 0;
-    } else {
-      return getSqlExecutor().executeUpdate(statementScope, conn, sqlString, parameters);
-    }
-  }
-
-  protected void sqlExecuteQuery(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
-    getSqlExecutor().executeQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback);
-  }
-
-  protected Object validateParameter(Object param)
-      throws SQLException {
-    Object newParam = param;
-    Class parameterClass = getParameterClass();
-    if (newParam != null && parameterClass != null) {
-      if (DomTypeMarker.class.isAssignableFrom(parameterClass)) {
-        if (XmlTypeMarker.class.isAssignableFrom(parameterClass)) {
-          if (!(newParam instanceof String)
-              && !(newParam instanceof Document)) {
-            throw new SQLException("Invalid parameter object type.  Expected '" + String.class.getName() + "' or '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'.");
-          }
-          if (!(newParam instanceof Document)) {
-            newParam = stringToDocument ((String)newParam);
-          }
-        } else {
-          if (!Document.class.isAssignableFrom(newParam.getClass())) {
-            throw new SQLException("Invalid parameter object type.  Expected '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'.");
-          }
-        }
-      } else {
-        if (!parameterClass.isAssignableFrom(newParam.getClass())) {
-          throw new SQLException("Invalid parameter object type.  Expected '" + parameterClass.getName() + "' but found '" + newParam.getClass().getName() + "'.");
-        }
-      }
-    }
-    return newParam;
-  }
-
-  private Document stringToDocument (String s) {
-    try {
-      DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-      DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
-      return documentBuilder.parse(new ReaderInputStream(new StringReader(s)));
-    } catch (Exception e) {
-      throw new RuntimeException("Error occurred.  Cause: " + e, e);
-    }
-  }
-
-  public String getId() {
-    return id;
-  }
-
-  public Integer getResultSetType() {
-    return resultSetType;
-  }
-
-  public void setResultSetType(Integer resultSetType) {
-    this.resultSetType = resultSetType;
-  }
-
-  public Integer getFetchSize() {
-    return fetchSize;
-  }
-
-  public void setFetchSize(Integer fetchSize) {
-    this.fetchSize = fetchSize;
-  }
-
-  public void setId(String id) {
-    this.id = id;
-  }
-
-  public Sql getSql() {
-    return sql;
-  }
-
-  public void setSql(Sql sql) {
-    this.sql = sql;
-  }
-
-  public ResultMap getResultMap() {
-    return resultMap;
-  }
-
-  public void setResultMap(ResultMap resultMap) {
-    this.resultMap = resultMap;
-  }
-
-  public ParameterMap getParameterMap() {
-    return parameterMap;
-  }
-
-  public void setParameterMap(ParameterMap parameterMap) {
-    this.parameterMap = parameterMap;
-  }
-
-  public Class getParameterClass() {
-    return parameterClass;
-  }
-
-  public void setParameterClass(Class parameterClass) {
-    this.parameterClass = parameterClass;
-  }
-
-  public String getResource() {
-    return resource;
-  }
-
-  public void setResource(String resource) {
-    this.resource = resource;
-  }
-
-  public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) {
-    Sql sql = statementScope.getSql();
-    ParameterMap pmap = sql.getParameterMap(statementScope, parameterObject);
-    CacheKey cacheKey = pmap.getCacheKey(statementScope, parameterObject);
-    cacheKey.update(id);
-    cacheKey.update(baseCacheKey);
-    cacheKey.update(sql.getSql(statementScope, parameterObject)); //Fixes bug 953001
-    return cacheKey;
-  }
-
-  public void setBaseCacheKey(int base) {
-    this.baseCacheKey = base;
-  }
-
-  public void addExecuteListener(ExecuteListener listener) {
-    executeListeners.add(listener);
-  }
-
-  public void notifyListeners() {
-    for (int i = 0, n = executeListeners.size(); i < n; i++) {
-      ((ExecuteListener) executeListeners.get(i)).onExecuteStatement(this);
-    }
-  }
-
-  public SqlExecutor getSqlExecutor() {
-    return sqlMapClient.getSqlExecutor();
-  }
-
-  public SqlMapClient getSqlMapClient() {
-    return sqlMapClient;
-  }
-
-  public void setSqlMapClient(SqlMapClient sqlMapClient) {
-    this.sqlMapClient = (ExtendedSqlMapClient) sqlMapClient;
-  }
-
-  public void initRequest(StatementScope statementScope) {
-    statementScope.setStatement(this);
-    statementScope.setParameterMap(parameterMap);
-    statementScope.setResultMap(resultMap);
-    statementScope.setSql(sql);
-  }
-
-  public Integer getTimeout() {
-    return timeout;
-  }
-
-  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;
-  }
-}
+/*
+ *  Copyright 2004 Clinton Begin
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package com.ibatis.sqlmap.engine.mapping.statement;
+
+import com.ibatis.common.jdbc.exception.NestedSQLException;
+import com.ibatis.common.io.ReaderInputStream;
+
+import com.ibatis.sqlmap.client.event.RowHandler;
+import com.ibatis.sqlmap.client.*;
+import com.ibatis.sqlmap.engine.execution.SqlExecutor;
+import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
+import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
+import com.ibatis.sqlmap.engine.mapping.sql.Sql;
+import com.ibatis.sqlmap.engine.scope.ErrorContext;
+import com.ibatis.sqlmap.engine.scope.StatementScope;
+import com.ibatis.sqlmap.engine.transaction.Transaction;
+import com.ibatis.sqlmap.engine.transaction.TransactionException;
+import com.ibatis.sqlmap.engine.type.*;
+import com.ibatis.sqlmap.engine.cache.*;
+import com.ibatis.sqlmap.engine.impl.*;
+import org.w3c.dom.Document;
+
+import javax.xml.parsers.*;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.*;
+import java.io.*;
+
+public class MappedStatement {
+  private String id;
+  private Integer resultSetType;
+  private Integer fetchSize;
+  private ResultMap resultMap;
+  private ParameterMap parameterMap;
+  private Class parameterClass;
+  private Sql sql;
+  private int baseCacheKey;
+  private SqlMapClientImpl sqlMapClient;
+  private Integer timeout;
+  private ResultMap[] additionalResultMaps = new ResultMap[0];
+  private List executeListeners = new ArrayList();
+  private String resource;
+
+  public StatementType getStatementType() {
+    return StatementType.UNKNOWN;
+  }
+
+  public int executeUpdate(StatementScope statementScope, Transaction trans, Object parameterObject)
+      throws SQLException {
+    ErrorContext errorContext = statementScope.getErrorContext();
+    errorContext.setActivity("preparing the mapped statement for execution");
+    errorContext.setObjectId(this.getId());
+    errorContext.setResource(this.getResource());
+
+    statementScope.getSession().setCommitRequired(true);
+
+    try {
+      parameterObject = validateParameter(parameterObject);
+
+      Sql sql = getSql();
+
+      errorContext.setMoreInfo("Check the parameter map.");
+      ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject);
+
+      errorContext.setMoreInfo("Check the result map.");
+      ResultMap resultMap = sql.getResultMap(statementScope, parameterObject);
+
+      statementScope.setResultMap(resultMap);
+      statementScope.setParameterMap(parameterMap);
+
+      int rows = 0;
+
+      errorContext.setMoreInfo("Check the parameter map.");
+      Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject);
+
+      errorContext.setMoreInfo("Check the SQL statement.");
+      String sqlString = sql.getSql(statementScope, parameterObject);
+
+      errorContext.setActivity("executing mapped statement");
+      errorContext.setMoreInfo("Check the statement or the result map.");
+      rows = sqlExecuteUpdate(statementScope, trans.getConnection(), sqlString, parameters);
+
+      errorContext.setMoreInfo("Check the output parameters.");
+      if (parameterObject != null) {
+        postProcessParameterObject(statementScope, parameterObject, parameters);
+      }
+
+      errorContext.reset();
+      sql.cleanup(statementScope);
+      notifyListeners();
+      return rows;
+    } catch (SQLException e) {
+      errorContext.setCause(e);
+      throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e);
+    } catch (Exception e) {
+      errorContext.setCause(e);
+      throw new NestedSQLException(errorContext.toString(), e);
+    }
+  }
+
+  public Object executeQueryForObject(StatementScope statementScope, Transaction trans, Object parameterObject, Object resultObject)
+      throws SQLException {
+    try {
+      Object object = null;
+
+      DefaultRowHandler rowHandler = new DefaultRowHandler();
+      executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, resultObject, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);
+      List list = rowHandler.getList();
+
+      if (list.size() > 1) {
+        throw new SQLException("Error: executeQueryForObject returned too many results.");
+      } else if (list.size() > 0) {
+        object = list.get(0);
+      }
+
+      return object;
+    } catch (TransactionException e) {
+      throw new NestedSQLException("Error getting Connection from Transaction.  Cause: " + e, e);
+    }
+  }
+
+  public List executeQueryForList(StatementScope statementScope, Transaction trans, Object parameterObject, int skipResults, int maxResults)
+      throws SQLException {
+    try {
+      DefaultRowHandler rowHandler = new DefaultRowHandler();
+      executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, skipResults, maxResults);
+      return rowHandler.getList();
+    } catch (TransactionException e) {
+      throw new NestedSQLException("Error getting Connection from Transaction.  Cause: " + e, e);
+    }
+  }
+
+  public void executeQueryWithRowHandler(StatementScope statementScope, Transaction trans, Object parameterObject, RowHandler rowHandler)
+      throws SQLException {
+    try {
+      executeQueryWithCallback(statementScope, trans.getConnection(), parameterObject, null, rowHandler, SqlExecutor.NO_SKIPPED_RESULTS, SqlExecutor.NO_MAXIMUM_RESULTS);
+    } catch (TransactionException e) {
+      throw new NestedSQLException("Error getting Connection from Transaction.  Cause: " + e, e);
+    }
+  }
+
+  //
+  //  PROTECTED METHODS
+  //
+
+  protected void executeQueryWithCallback(StatementScope statementScope, Connection conn, Object parameterObject, Object resultObject, RowHandler rowHandler, int skipResults, int maxResults)
+      throws SQLException {
+    ErrorContext errorContext = statementScope.getErrorContext();
+    errorContext.setActivity("preparing the mapped statement for execution");
+    errorContext.setObjectId(this.getId());
+    errorContext.setResource(this.getResource());
+
+    try {
+      parameterObject = validateParameter(parameterObject);
+
+      Sql sql = getSql();
+
+      errorContext.setMoreInfo("Check the parameter map.");
+      ParameterMap parameterMap = sql.getParameterMap(statementScope, parameterObject);
+
+      errorContext.setMoreInfo("Check the result map.");
+      ResultMap resultMap = sql.getResultMap(statementScope, parameterObject);
+
+      statementScope.setResultMap(resultMap);
+      statementScope.setParameterMap(parameterMap);
+
+      errorContext.setMoreInfo("Check the parameter map.");
+      Object[] parameters = parameterMap.getParameterObjectValues(statementScope, parameterObject);
+
+      errorContext.setMoreInfo("Check the SQL statement.");
+      String sqlString = sql.getSql(statementScope, parameterObject);
+
+      errorContext.setActivity("executing mapped statement");
+      errorContext.setMoreInfo("Check the SQL statement or the result map.");
+      RowHandlerCallback callback = new RowHandlerCallback(resultMap, resultObject, rowHandler);
+      sqlExecuteQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback);
+
+      errorContext.setMoreInfo("Check the output parameters.");
+      if (parameterObject != null) {
+        postProcessParameterObject(statementScope, parameterObject, parameters);
+      }
+
+      errorContext.reset();
+      sql.cleanup(statementScope);
+      notifyListeners();
+    } catch (SQLException e) {
+      errorContext.setCause(e);
+      throw new NestedSQLException(errorContext.toString(), e.getSQLState(), e.getErrorCode(), e);
+    } catch (Exception e) {
+      errorContext.setCause(e);
+      throw new NestedSQLException(errorContext.toString(), e);
+    }
+  }
+
+  protected void postProcessParameterObject(StatementScope statementScope, Object parameterObject, Object[] parameters) {
+  }
+
+  protected int sqlExecuteUpdate(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters) throws SQLException {
+    if (statementScope.getSession().isInBatch()) {
+      getSqlExecutor().addBatch(statementScope, conn, sqlString, parameters);
+      return 0;
+    } else {
+      return getSqlExecutor().executeUpdate(statementScope, conn, sqlString, parameters);
+    }
+  }
+
+  protected void sqlExecuteQuery(StatementScope statementScope, Connection conn, String sqlString, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
+    getSqlExecutor().executeQuery(statementScope, conn, sqlString, parameters, skipResults, maxResults, callback);
+  }
+
+  protected Object validateParameter(Object param)
+      throws SQLException {
+    Object newParam = param;
+    Class parameterClass = getParameterClass();
+    if (newParam != null && parameterClass != null) {
+      if (DomTypeMarker.class.isAssignableFrom(parameterClass)) {
+        if (XmlTypeMarker.class.isAssignableFrom(parameterClass)) {
+          if (!(newParam instanceof String)
+              && !(newParam instanceof Document)) {
+            throw new SQLException("Invalid parameter object type.  Expected '" + String.class.getName() + "' or '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'.");
+          }
+          if (!(newParam instanceof Document)) {
+            newParam = stringToDocument ((String)newParam);
+          }
+        } else {
+          if (!Document.class.isAssignableFrom(newParam.getClass())) {
+            throw new SQLException("Invalid parameter object type.  Expected '" + Document.class.getName() + "' but found '" + newParam.getClass().getName() + "'.");
+          }
+        }
+      } else {
+        if (!parameterClass.isAssignableFrom(newParam.getClass())) {
+          throw new SQLException("Invalid parameter object type.  Expected '" + parameterClass.getName() + "' but found '" + newParam.getClass().getName() + "'.");
+        }
+      }
+    }
+    return newParam;
+  }
+
+  private Document stringToDocument (String s) {
+    try {
+      DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+      DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+      return documentBuilder.parse(new ReaderInputStream(new StringReader(s)));
+    } catch (Exception e) {
+      throw new RuntimeException("Error occurred.  Cause: " + e, e);
+    }
+  }
+
+  public String getId() {
+    return id;
+  }
+
+  public Integer getResultSetType() {
+    return resultSetType;
+  }
+
+  public void setResultSetType(Integer resultSetType) {
+    this.resultSetType = resultSetType;
+  }
+
+  public Integer getFetchSize() {
+    return fetchSize;
+  }
+
+  public void setFetchSize(Integer fetchSize) {
+    this.fetchSize = fetchSize;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Sql getSql() {
+    return sql;
+  }
+
+  public void setSql(Sql sql) {
+    this.sql = sql;
+  }
+
+  public ResultMap getResultMap() {
+    return resultMap;
+  }
+
+  public void setResultMap(ResultMap resultMap) {
+    this.resultMap = resultMap;
+  }
+
+  public ParameterMap getParameterMap() {
+    return parameterMap;
+  }
+
+  public void setParameterMap(ParameterMap parameterMap) {
+    this.parameterMap = parameterMap;
+  }
+
+  public Class getParameterClass() {
+    return parameterClass;
+  }
+
+  public void setParameterClass(Class parameterClass) {
+    this.parameterClass = parameterClass;
+  }
+
+  public String getResource() {
+    return resource;
+  }
+
+  public void setResource(String resource) {
+    this.resource = resource;
+  }
+
+  public CacheKey getCacheKey(StatementScope statementScope, Object parameterObject) {
+    Sql sql = statementScope.getSql();
+    ParameterMap pmap = sql.getParameterMap(statementScope, parameterObject);
+    CacheKey cacheKey = pmap.getCacheKey(statementScope, parameterObject);
+    cacheKey.update(id);
+    cacheKey.update(baseCacheKey);
+    cacheKey.update(sql.getSql(statementScope, parameterObject)); //Fixes bug 953001
+    return cacheKey;
+  }
+
+  public void setBaseCacheKey(int base) {
+    this.baseCacheKey = base;
+  }
+
+  public void addExecuteListener(ExecuteListener listener) {
+    executeListeners.add(listener);
+  }
+
+  public void notifyListeners() {
+    for (int i = 0, n = executeListeners.size(); i < n; i++) {
+      ((ExecuteListener) executeListeners.get(i)).onExecuteStatement(this);
+    }
+  }
+
+  public SqlExecutor getSqlExecutor() {
+    return sqlMapClient.getSqlExecutor();
+  }
+
+  public SqlMapClient getSqlMapClient() {
+    return sqlMapClient;
+  }
+
+  public void setSqlMapClient(SqlMapClient sqlMapClient) {
+    this.sqlMapClient = (SqlMapClientImpl) sqlMapClient;
+  }
+
+  public void initRequest(StatementScope statementScope) {
+    statementScope.setStatement(this);
+    statementScope.setParameterMap(parameterMap);
+    statementScope.setResultMap(resultMap);
+    statementScope.setSql(sql);
+  }
+
+  public Integer getTimeout() {
+    return timeout;
+  }
+
+  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;
+  }
+}