CallableStatementHandler.java
- /*
- * Copyright 2009-2024 the original author or authors.
- *
- * 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
- *
- * https://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 org.apache.ibatis.executor.statement;
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.List;
- import org.apache.ibatis.cursor.Cursor;
- import org.apache.ibatis.executor.Executor;
- import org.apache.ibatis.executor.ExecutorException;
- import org.apache.ibatis.executor.keygen.KeyGenerator;
- import org.apache.ibatis.mapping.BoundSql;
- import org.apache.ibatis.mapping.MappedStatement;
- import org.apache.ibatis.mapping.ParameterMapping;
- import org.apache.ibatis.mapping.ParameterMode;
- import org.apache.ibatis.mapping.ResultSetType;
- import org.apache.ibatis.session.ResultHandler;
- import org.apache.ibatis.session.RowBounds;
- import org.apache.ibatis.type.JdbcType;
- /**
- * @author Clinton Begin
- */
- public class CallableStatementHandler extends BaseStatementHandler {
- public CallableStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameter,
- RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
- super(executor, mappedStatement, parameter, rowBounds, resultHandler, boundSql);
- }
- @Override
- public int update(Statement statement) throws SQLException {
- CallableStatement cs = (CallableStatement) statement;
- cs.execute();
- int rows = cs.getUpdateCount();
- Object parameterObject = boundSql.getParameterObject();
- KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
- keyGenerator.processAfter(executor, mappedStatement, cs, parameterObject);
- resultSetHandler.handleOutputParameters(cs);
- return rows;
- }
- @Override
- public void batch(Statement statement) throws SQLException {
- CallableStatement cs = (CallableStatement) statement;
- cs.addBatch();
- }
- @Override
- public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
- CallableStatement cs = (CallableStatement) statement;
- cs.execute();
- List<E> resultList = resultSetHandler.handleResultSets(cs);
- resultSetHandler.handleOutputParameters(cs);
- return resultList;
- }
- @Override
- public <E> Cursor<E> queryCursor(Statement statement) throws SQLException {
- CallableStatement cs = (CallableStatement) statement;
- cs.execute();
- Cursor<E> resultList = resultSetHandler.handleCursorResultSets(cs);
- resultSetHandler.handleOutputParameters(cs);
- return resultList;
- }
- @Override
- protected Statement instantiateStatement(Connection connection) throws SQLException {
- String sql = boundSql.getSql();
- if (mappedStatement.getResultSetType() == ResultSetType.DEFAULT) {
- return connection.prepareCall(sql);
- }
- return connection.prepareCall(sql, mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);
- }
- @Override
- public void parameterize(Statement statement) throws SQLException {
- registerOutputParameters((CallableStatement) statement);
- parameterHandler.setParameters((CallableStatement) statement);
- }
- private void registerOutputParameters(CallableStatement cs) throws SQLException {
- List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
- for (int i = 0, n = parameterMappings.size(); i < n; i++) {
- ParameterMapping parameterMapping = parameterMappings.get(i);
- if (parameterMapping.getMode() == ParameterMode.OUT || parameterMapping.getMode() == ParameterMode.INOUT) {
- if (null == parameterMapping.getJdbcType()) {
- throw new ExecutorException(
- "The JDBC Type must be specified for output parameter. Parameter: " + parameterMapping.getProperty());
- }
- if (parameterMapping.getNumericScale() != null && (parameterMapping.getJdbcType() == JdbcType.NUMERIC
- || parameterMapping.getJdbcType() == JdbcType.DECIMAL)) {
- cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE, parameterMapping.getNumericScale());
- } else {
- if (parameterMapping.getJdbcTypeName() == null) {
- cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE);
- } else {
- cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE,
- parameterMapping.getJdbcTypeName());
- }
- }
- }
- }
- }
- }