1 /* 2 * Copyright 2002-2005 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.springframework.jdbc.core; 18 19 import java.sql.SQLException; 20 import java.sql.Statement; 21 22 import org.springframework.dao.DataAccessException; 23 24 /** 25 * Generic callback interface for code that operates on a JDBC Statement. 26 * Allows to execute any number of operations on a single Statement, 27 * for example a single <code>executeUpdate</code> call or repeated 28 * <code>executeUpdate</code> calls with varying SQL. 29 * 30 * <p>Used internally by JdbcTemplate, but also useful for application code. 31 * 32 * @author Juergen Hoeller 33 * @since 16.03.2004 34 * @see JdbcTemplate#execute(StatementCallback) 35 */ 36 public interface StatementCallback { 37 38 /** 39 * Gets called by <code>JdbcTemplate.execute</code> with an active JDBC 40 * Statement. Does not need to care about closing the Statement or the 41 * Connection, or about handling transactions: this will all be handled 42 * by Spring's JdbcTemplate. 43 * 44 * <p><b>NOTE:</b> Any ResultSets opened should be closed in finally blocks 45 * within the callback implementation. Spring will close the Statement 46 * object after the callback returned, but this does not necessarily imply 47 * that the ResultSet resources will be closed: the Statement objects might 48 * get pooled by the connection pool, with <code>close</code> calls only 49 * returning the object to the pool but not physically closing the resources. 50 * 51 * <p>If called without a thread-bound JDBC transaction (initiated by 52 * DataSourceTransactionManager), the code will simply get executed on the 53 * JDBC connection with its transactional semantics. If JdbcTemplate is 54 * configured to use a JTA-aware DataSource, the JDBC connection and thus 55 * the callback code will be transactional if a JTA transaction is active. 56 * 57 * <p>Allows for returning a result object created within the callback, i.e. 58 * a domain object or a collection of domain objects. Note that there's 59 * special support for single step actions: see JdbcTemplate.queryForObject etc. 60 * A thrown RuntimeException is treated as application exception, it gets 61 * propagated to the caller of the template. 62 * 63 * @param stmt active JDBC Statement 64 * @return a result object, or <code>null</code> if none 65 * @throws SQLException if thrown by a JDBC method, to be auto-converted 66 * to a DataAccessException by a SQLExceptionTranslator 67 * @throws DataAccessException in case of custom exceptions 68 * @see JdbcTemplate#queryForObject(String, Class) 69 * @see JdbcTemplate#queryForRowSet(String) 70 */ 71 Object doInStatement(Statement stmt) throws SQLException, DataAccessException; 72 73 } 74