Search code examples
javajdbcresultsetjdbi

JDBI resultsetmapper create list of objects from query resultset?


Opting for an alternative to JPA and Spring-Data I wanted to try out JDBI for my Repository implementation with SQLite

Repository Code

 /**
 * SQLite implementation of Foo Repository
 */
public class FooRepository implements FooRepository {

    private final DBI connection;

    /**
     * The constructor initialises the connection to the local SQLite file
     *
     * @param dataSource jdbc connection string e.g. "jdbc:sqlite::resource:db/foo.db"
     * @throws IllegalArgumentException when an invalid DB file is given
     */
    public FooRepository(final SQLiteDataSource dataSource) {
        checkNotNull(dataSource, "dataSource required");
        connection = new DBI(dataSource);
    }

    /**
     * Returns a list of Foo objects for a website locale in the DB

     * @return List
     * @throws SQLException error querying
     */
    @Override
    public List<Foo> getFoosByWebsiteLocale(f) throws SQLException {
        checkNotNull(websiteLocale, "websiteLocale required");

        final String fooQuery =  query...

        Handle queryHandler = connection.open();

        final List<Foo> fooList = queryHandler.createQuery(fooQuery)
            .map(FooMapper.class);

        queryHandler.close();

        return fooList;
    }
}

Mapper

public class FooMapper implements ResultSetMapper {

    /**
     * Construct a Foo object from a record in the result set
     * @param index row number
     * @param resultRow row
     * @param ctx statementcontext
     * @return Foo object
     * @throws SQLException when accessing sql result set
     */
    @Override
    public Foo map(final int index, final ResultSet resultRow, final StatementContext ctx) throws SQLException {
        return Foo.builder()
                .name(resultRow.getString("foo_name"))
                .type(resultRow.getString("foo_type"))
                .build();
    }
}

I am struggling to understand how I will create a list of Foo objects using ResultSetMapper.

The JDBI documentation also appears to be broken on this area :

http://jdbi.org/maven_site/apidocs/org/skife/jdbi/v2/tweak/ResultSetMapper.html

Help would be appreciated on how to make this work.


Solution

  • Your mapper only needs to map one row to one Foo object. JDBI will create the list and put the objects in the list for you. I.e.:

    final List<Foo> fooList = queryHandler.createQuery(fooQuery).map(FooMapper.class).list();