/*
 * 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.skife.jdbi.v2;

import org.skife.jdbi.v2.exceptions.ResultSetException;
import org.skife.jdbi.v2.tweak.ResultSetMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

Wrapper object for generated keys as returned by the Statement.getGeneratedKeys()
Type parameters:
  • <Type> – the key type returned
/** * Wrapper object for generated keys as returned by the {@link Statement#getGeneratedKeys()} * * @param <Type> the key type returned */
public class GeneratedKeys<Type> implements ResultBearing<Type> { private final ResultSetMapper<Type> mapper; private final SQLStatement<?> jdbiStatement; private final Statement stmt; private final ResultSet results; private final StatementContext context; private final ContainerFactoryRegistry containerFactoryRegistry;
Creates a new wrapper object for generated keys as returned by the Statement.getGeneratedKeys() method for update and insert statement for drivers that support this function.
Params:
  • mapper – Maps the generated keys result set to an object
  • jdbiStatement – The original jDBI statement
  • stmt – The corresponding sql statement
  • context – The statement context
/** * Creates a new wrapper object for generated keys as returned by the {@link Statement#getGeneratedKeys()} * method for update and insert statement for drivers that support this function. * * @param mapper Maps the generated keys result set to an object * @param jdbiStatement The original jDBI statement * @param stmt The corresponding sql statement * @param context The statement context */
GeneratedKeys(ResultSetMapper<Type> mapper, SQLStatement<?> jdbiStatement, Statement stmt, StatementContext context, ContainerFactoryRegistry containerFactoryRegistry) throws SQLException { this.mapper = mapper; this.jdbiStatement = jdbiStatement; this.stmt = stmt; this.results = stmt.getGeneratedKeys(); this.context = context; this.containerFactoryRegistry = containerFactoryRegistry.createChild(); this.jdbiStatement.addCleanable(Cleanables.forResultSet(results)); }
Returns the first generated key.
Returns:The key or null if no keys were returned
/** * Returns the first generated key. * * @return The key or null if no keys were returned */
@Override public Type first() { try { if (results != null && results.next()) { return mapper.map(0, results, context); } else { // no result matches return null; } } catch (SQLException e) { throw new ResultSetException("Exception thrown while attempting to traverse the result set", e, context); } finally { jdbiStatement.cleanup(); } } @Override public <T> T first(Class<T> containerType) { // return containerFactoryRegistry.lookup(containerType).create(Arrays.asList(first())); throw new UnsupportedOperationException("Not Yet Implemented!"); } @Override public <ContainerType> ContainerType list(Class<ContainerType> containerType) { // return containerFactoryRegistry.lookup(containerType).create(Arrays.asList(list())); throw new UnsupportedOperationException("Not Yet Implemented!"); } @Override public List<Type> list(int maxRows) { try { int idx = 0; List<Type> resultList = new ArrayList<Type>(); if (results != null && ++idx <= maxRows && !results.isClosed()) { int index = 0; while (results.next()) { resultList.add(mapper.map(index++, results, context)); } } return resultList; } catch (SQLException e) { throw new ResultSetException("Exception thrown while attempting to traverse the result set", e, context); } finally { jdbiStatement.cleanup(); } }
Returns a list of all generated keys.
Returns:The list of keys or an empty list if no keys were returned
/** * Returns a list of all generated keys. * * @return The list of keys or an empty list if no keys were returned */
@Override public List<Type> list() { return list(Integer.MAX_VALUE); }
Returns a iterator over all generated keys.
Returns:The key iterator
/** * Returns a iterator over all generated keys. * * @return The key iterator */
@Override public ResultIterator<Type> iterator() { try { return new ResultSetResultIterator<Type>(mapper, jdbiStatement, stmt, context); } catch (SQLException e) { throw new ResultSetException("Exception thrown while attempting to traverse the result set", e, context); } }
Used to execute the query and traverse the generated keys with a accumulator. Folding over the keys involves invoking a callback for each row, passing into the callback the return value from the previous function invocation.
Params:
  • accumulator – The initial accumulator value
  • folder – Defines the function which will fold over the result set.
See Also:
Returns:The return value from the last invocation of Folder.fold(Object, ResultSet)
/** * Used to execute the query and traverse the generated keys with a accumulator. * <a href="http://en.wikipedia.org/wiki/Fold_(higher-order_function)">Folding</a> over the * keys involves invoking a callback for each row, passing into the callback the return value * from the previous function invocation. * * @param accumulator The initial accumulator value * @param folder Defines the function which will fold over the result set. * * @return The return value from the last invocation of {@link Folder#fold(Object, java.sql.ResultSet)} * * @see org.skife.jdbi.v2.Folder */
public <AccumulatorType> AccumulatorType fold(AccumulatorType accumulator, final Folder2<AccumulatorType> folder) { try { AccumulatorType value = accumulator; if (results != null && !results.isClosed()) { while (results.next()) { value = folder.fold(value, results, context); } } return value; } catch (SQLException e) { throw new ResultSetException("Exception thrown while attempting to traverse the result set", e, context); } finally { jdbiStatement.cleanup(); } } }