001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry.contrib.jdbc;
016
017import java.sql.Connection;
018import java.sql.PreparedStatement;
019import java.sql.ResultSet;
020import java.sql.SQLException;
021import java.sql.Statement;
022import java.util.List;
023
024import org.apache.commons.logging.Log;
025import org.apache.commons.logging.LogFactory;
026
027/**
028 *  A wrapper around {@link PreparedStatement}.
029 *
030 *  @author Howard Lewis Ship
031 * 
032 **/
033
034public class ParameterizedStatement implements IStatement
035{
036    private static final Log LOG = LogFactory.getLog(ParameterizedStatement.class);
037
038    private String _SQL;
039    private PreparedStatement _statement;
040    private IParameter[] _parameters;
041
042    /**
043     *  Create a new instance; the parameters list is copied.
044     * 
045     *  @param SQL the SQL to execute (see {@link Connection#prepareStatement(java.lang.String)})
046     *  @param connection the JDBC connection to use
047     *  @param parameters list of {@link IParameter}
048     * 
049     **/
050    
051    public ParameterizedStatement(String SQL, Connection connection, List parameters) throws SQLException
052    {
053        _SQL = SQL;
054
055        _statement = connection.prepareStatement(SQL);
056
057        _parameters = (IParameter[]) parameters.toArray(new IParameter[parameters.size()]);
058
059        for (int i = 0; i < _parameters.length; i++)
060        {
061            // JDBC numbers things from 1, not 0.
062
063            _parameters[i].set(_statement, i + 1);
064        }
065    }
066
067    /**
068     * Returns the SQL associated with this statement.
069     *
070     **/
071
072    public String getSQL()
073    {
074        return _SQL;
075    }
076
077    /**
078     *  Returns the underlying or {@link PreparedStatement}.
079     *
080     **/
081
082    public Statement getStatement()
083    {
084        return _statement;
085    }
086
087    /**
088     *  Closes the underlying statement, and nulls the reference to it.
089     *
090     **/
091
092    public void close() throws SQLException
093    {
094        _statement.close();
095
096        _statement = null;
097        _SQL = null;
098    }
099
100    /**
101     *  Executes the statement as a query, returning a {@link ResultSet}.
102     *
103     **/
104
105    public ResultSet executeQuery() throws SQLException
106    {
107        if (LOG.isDebugEnabled())
108            LOG.debug("Executing query: " + this);
109
110        return _statement.executeQuery();
111    }
112
113    /**
114     *  Executes the statement as an update, returning the number of rows
115     *  affected.
116     *
117     **/
118
119    public int executeUpdate() throws SQLException
120    {
121        if (LOG.isDebugEnabled())
122            LOG.debug("Executing update: " + this);
123
124        return _statement.executeUpdate();
125    }
126
127    public String toString()
128    {
129        StringBuffer buffer = new StringBuffer("ParameterizedStatement@");
130        buffer.append(Integer.toHexString(hashCode()));
131        buffer.append("[SQL=\n<");
132        buffer.append(_SQL);
133        buffer.append("\n>");
134
135        for (int i = 0; i < _parameters.length; i++)
136        {
137            IParameter parameter = _parameters[i];
138
139            buffer.append(" ?");
140            buffer.append(i + 1);
141            buffer.append('=');
142
143            buffer.append(parameter);
144        }
145
146        buffer.append(']');
147
148        return buffer.toString();
149    }
150
151}