001    package com.alexkasko.springjdbc.iterable;
002    
003    import org.springframework.dao.DataAccessException;
004    import org.springframework.jdbc.core.ColumnMapRowMapper;
005    import org.springframework.jdbc.core.RowMapper;
006    import org.springframework.jdbc.core.SingleColumnRowMapper;
007    import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
008    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
009    import org.springframework.jdbc.core.namedparam.SqlParameterSource;
010    
011    import javax.sql.DataSource;
012    import java.util.Map;
013    
014    /**
015     * {@code NamedParameterJdbcTemplate} extension. All methods, that return {@code List}
016     * mirrored with {@code queryForIter} methods that return {@link CloseableIterator}.
017     *
018     * @author alexkasko
019     *         Date: 11/7/12
020     */
021    public class IterableNamedParameterJdbcTemplate extends NamedParameterJdbcTemplate implements IterableNamedParameterJdbcOperations {
022    
023        /**
024         * Constructor
025         *
026         * @param dataSource data source
027         */
028        public IterableNamedParameterJdbcTemplate(DataSource dataSource) {
029            super(new IterableJdbcTemplate(dataSource));
030        }
031    
032        /**
033         * Constructor, takes {@code fetchSize}
034         *
035         * @param dataSource data source
036         * @param fetchSize <a href=http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jdbc/core/JdbcTemplate.html#setFetchSize%28int%29>fetchSize</a> property value
037         */
038        public IterableNamedParameterJdbcTemplate(DataSource dataSource, int fetchSize) {
039            super(new IterableJdbcTemplate(dataSource, fetchSize));
040        }
041    
042        /**
043         * {@inheritDoc}
044         */
045        @Override
046        public IterableJdbcOperations getIterableJdbcOperations() {
047            return (IterableJdbcOperations) getJdbcOperations();
048        }
049    
050        /**
051         * {@inheritDoc}
052         */
053        @Override
054        public <T> CloseableIterator<T> queryForIter(String sql, SqlParameterSource paramSource, RowMapper<T> rowMapper) throws DataAccessException {
055            return getIterableJdbcOperations().queryForIter(getPreparedStatementCreator(sql, paramSource), rowMapper);
056        }
057    
058        /**
059         * {@inheritDoc}
060         */
061        @Override
062        public <T> CloseableIterator<T> queryForIter(String sql, Map<String, ?> paramMap, RowMapper<T> rowMapper) throws DataAccessException {
063            return queryForIter(sql, new MapSqlParameterSource(paramMap), rowMapper);
064        }
065    
066        /**
067         * {@inheritDoc}
068         */
069        @Override
070        public <T> CloseableIterator<T> queryForIter(String sql, SqlParameterSource paramSource, Class<T> elementType) throws DataAccessException {
071            return queryForIter(sql, paramSource, new SingleColumnRowMapper<T>(elementType));
072        }
073    
074        /**
075         * {@inheritDoc}
076         */
077        @Override
078        public <T> CloseableIterator<T> queryForIter(String sql, Map<String, ?> paramMap, Class<T> elementType) throws DataAccessException {
079            return queryForIter(sql, new MapSqlParameterSource(paramMap), elementType);
080        }
081    
082        /**
083         * {@inheritDoc}
084         */
085        @Override
086        public CloseableIterator<Map<String, Object>> queryForIter(String sql, SqlParameterSource paramSource) throws DataAccessException {
087            return queryForIter(sql, paramSource, new ColumnMapRowMapper());
088        }
089    
090        /**
091         * {@inheritDoc}
092         */
093        @Override
094        public CloseableIterator<Map<String, Object>> queryForIter(String sql, Map<String, ?> paramMap) throws DataAccessException {
095            return queryForIter(sql, new MapSqlParameterSource(paramMap));
096        }
097    }