JDBI,使用sql查询将数据检索到自定义对象(构造函数)而不是Map

时间:2014-04-14 17:30:20

标签: java sql jdbi

因此,当我们使用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");

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

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

http://jdbi.org/sql_object_api_queries/

1 个答案:

答案 0 :(得分:11)

另请参阅文档中的上一页,其中介绍了如何将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"));
    }

}

然后我们需要一个接口来定义哪个查询提供传递给mapper类的数据。一个结果行导致一次调用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()