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}