8

所以当我们使用 JDBI 从数据库中查询时,它是把它变成一个Map<String, Object>类型。

我想将它作为我的自定义对象(构造函数)而不是Map<String, Object>.

DBI dbi = establishConnection(url, userName, passWord);
Handle handle = dbi.open();
List<Map<String, Object>> rs = handle.select("select * from sometable");

相反,我想使用:

List<customizedObject> rs = handle.select("select * from sometable");

其中customizedObjectclass 是一个包含所有列属性的对象。

有没有办法做到这一点?我找到了一些相关文档,但我无法真正理解实现。

http://jdbi.org/sql_object_api_queries/

4

1 回答 1

12

另请参阅文档中的上一页,该页面显示了如何链接您的HandleDBI与映射器。

本质上,您需要一个映射器来将其转换ResultSet为所需的对象,并需要一个接口来引用映射器。

让我们假设一个最小的例子。首先需要提供映射器:

public class CustomizedObjectMapper implements ResultSetMapper<customizedObject> {

    @Override
    public customizedObject map(int index, ResultSet r, StatementContext ctx)
            throws SQLException {
        return new customizedObject(r.getString("uuid"), r.getString("other_column"));
    }

}

然后我们需要一个接口来定义哪个查询提供了传递给映射器类的数据。一个结果行导致一次调用CustomizedObjectMapper.map(...)

@RegisterMapper(CustomizeObjectMapper.class)
public interface CustomizeObjectQuery {

    @SqlQuery("Select uuid, other_column from schema.relation")
    List<customizedObject> get();
}

最后,可以检索对象:List<customizedObject> test = dbi.open(CustomizeObjectQuery.class).get().

您也可以像这样将组件单独放在一起并省略接口: dbi.open().createQuery("Select uuid, other_colum from schema.relation").map(new EventMapper()).list()

于 2014-04-14T20:01:20.720 回答