选择替代JPA和Spring-Data的方法,我想尝试使用JDBI来通过SQLite实现我的存储库

储存库代码

 /**
 * 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;
    }
}


映射器

公共类FooMapper实现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();
    }
}


我正在努力了解如何使用ResultSetMapper创建Foo对象的列表。

JDBI文档在以下方面也似乎被破坏了:

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

帮助将不胜感激如何使这项工作。

最佳答案

您的映射器只需要将一行映射到一个Foo对象。 JDBI将创建列表,并将对象放入列表中。
即:

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

10-07 12:15