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 015 package org.apache.tapestry.contrib.jdbc; 016 017 import java.sql.Connection; 018 import java.sql.PreparedStatement; 019 import java.sql.ResultSet; 020 import java.sql.SQLException; 021 import java.sql.Statement; 022 import java.util.List; 023 024 import org.apache.commons.logging.Log; 025 import org.apache.commons.logging.LogFactory; 026 027 /** 028 * A wrapper around {@link PreparedStatement}. 029 * 030 * @author Howard Lewis Ship 031 * 032 **/ 033 034 public 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 }