- /*
- * Copyright 2002-2004 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
- *
- * 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 org.springframework.jdbc.core;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Types;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.LinkedList;
- import java.util.List;
- import org.springframework.dao.InvalidDataAccessApiUsageException;
- /**
- * Helper class that can efficiently create multiple PreparedStatementCreator
- * objects with different parameters based on a SQL statement and a single
- * set of parameter declarations.
- * @author Rod Johnson
- * @version $Id: PreparedStatementCreatorFactory.java,v 1.11 2004/05/28 14:11:41 jhoeller Exp $
- */
- public class PreparedStatementCreatorFactory {
- /** The SQL, which won't change when the parameters change */
- private final String sql;
- /** List of SqlParameter objects. May not be null. */
- private final List declaredParameters;
- private int resultSetType = ResultSet.TYPE_FORWARD_ONLY;
- private boolean updatableResults = false;
- /**
- * Create a new factory. Will need to add parameters
- * via the addParameter() method or have no parameters.
- */
- public PreparedStatementCreatorFactory(String sql) {
- this.sql = sql;
- this.declaredParameters = new LinkedList();
- }
- /**
- * Create a new factory with the given SQL and JDBC types.
- * @param sql SQL to execute
- * @param types int array of JDBC types
- */
- public PreparedStatementCreatorFactory(String sql, int[] types) {
- this.sql = sql;
- this.declaredParameters = SqlParameter.sqlTypesToAnonymousParameterList(types);
- }
- /**
- * Create a new factory with the given SQL and parameters.
- * @param sql SQL
- * @param declaredParameters list of SqlParameter objects
- * @see SqlParameter
- */
- public PreparedStatementCreatorFactory(String sql, List declaredParameters) {
- this.sql = sql;
- this.declaredParameters = declaredParameters;
- }
- /**
- * Add a new declared parameter.
- * Order of parameter addition is significant.
- */
- public void addParameter(SqlParameter param) {
- this.declaredParameters.add(param);
- }
- /**
- * Set whether to use prepared statements that return a
- * specific type of ResultSet.
- * @param resultSetType the ResultSet type
- * @see java.sql.ResultSet#TYPE_FORWARD_ONLY
- * @see java.sql.ResultSet#TYPE_SCROLL_INSENSITIVE
- * @see java.sql.ResultSet#TYPE_SCROLL_SENSITIVE
- */
- public void setResultSetType(int resultSetType) {
- this.resultSetType = resultSetType;
- }
- /**
- * Set whether to use prepared statements capable of returning
- * updatable ResultSets.
- */
- public void setUpdatableResults(boolean updatableResults) {
- this.updatableResults = updatableResults;
- }
- /**
- * Return a new PreparedStatementCreator for the given parameters.
- * @param params parameter array. May be null.
- */
- public PreparedStatementCreator newPreparedStatementCreator(Object[] params) {
- return new PreparedStatementCreatorImpl((params != null) ? Arrays.asList(params) : Collections.EMPTY_LIST);
- }
- /**
- * Return a new PreparedStatementCreator for the given parameters.
- * @param params List of parameters. May be null.
- */
- public PreparedStatementCreator newPreparedStatementCreator(List params) {
- return new PreparedStatementCreatorImpl(params != null ? params : Collections.EMPTY_LIST);
- }
- /**
- * Return a new PreparedStatementSetter for the given parameters.
- * @param params parameter array. May be null.
- */
- public PreparedStatementSetter newPreparedStatementSetter(Object[] params) {
- return new PreparedStatementCreatorImpl((params != null) ? Arrays.asList(params) : Collections.EMPTY_LIST);
- }
- /**
- * Return a new PreparedStatementSetter for the given parameters.
- * @param params List of parameters. May be null.
- */
- public PreparedStatementSetter newPreparedStatementSetter(List params) {
- return new PreparedStatementCreatorImpl(params != null ? params : Collections.EMPTY_LIST);
- }
- /**
- * PreparedStatementCreator implementation returned by this class.
- */
- private class PreparedStatementCreatorImpl
- implements PreparedStatementCreator, PreparedStatementSetter, SqlProvider {
- private final List parameters;
- /**
- * Create a new PreparedStatementCreatorImpl.
- * @param parameters list of parameter objects
- */
- public PreparedStatementCreatorImpl(List parameters) {
- this.parameters = parameters;
- if (this.parameters.size() != declaredParameters.size())
- throw new InvalidDataAccessApiUsageException("SQL=[" + sql + "]: given " + this.parameters.size() +
- " parameter but expected " + declaredParameters.size());
- }
- public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
- PreparedStatement ps = null;
- if (resultSetType == ResultSet.TYPE_FORWARD_ONLY && !updatableResults) {
- ps = con.prepareStatement(sql);
- }
- else {
- ps = con.prepareStatement(sql, resultSetType,
- updatableResults ? ResultSet.CONCUR_UPDATABLE : ResultSet.CONCUR_READ_ONLY);
- }
- setValues(ps);
- return ps;
- }
- public void setValues(PreparedStatement ps) throws SQLException {
- // Set arguments: Does nothing if there are no parameters.
- for (int i = 0; i < this.parameters.size(); i++) {
- SqlParameter declaredParameter = (SqlParameter) declaredParameters.get(i);
- // we need SQL type to be able to set null
- if (this.parameters.get(i) == null) {
- ps.setNull(i + 1, declaredParameter.getSqlType());
- }
- else {
- switch (declaredParameter.getSqlType()) {
- case Types.VARCHAR:
- ps.setString(i + 1, this.parameters.get(i).toString());
- break;
- default :
- ps.setObject(i + 1, this.parameters.get(i), declaredParameter.getSqlType());
- break;
- }
- }
- }
- }
- public String getSql() {
- return sql;
- }
- public String toString() {
- StringBuffer buf = new StringBuffer("PreparedStatementCreatorFactory.PreparedStatementCreatorImpl: sql=[");
- buf.append(sql);
- buf.append("]: params=[");
- for (int i = 0; i < this.parameters.size(); i++) {
- if (i > 0) {
- buf.append(',');
- }
- buf.append(this.parameters.get(i));
- }
- return buf.toString() + "]";
- }
- }
- }