因此,当我们使用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是一个包含所有列属性的对象。
有没有办法做到这一点?我找到了一些相关文档,但我无法理解实现。
答案 0 :(得分:11)
另请参阅文档中的上一页,其中介绍了如何将Handle
或DBI
与地图制作者相关联。
基本上,您需要一个映射器将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()