2014-04-14 32 views
8

因此,当我们使用JDBI从数据库中进行查询时,它会将其转换为Map<String, Object>类型。JDBI,将sql查询中的数据检索到定制对象(构造函数)中而不是映射

我想把它作为我的自定义对象(构造函数)而不是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类是包含所有与它的列属性的对象。

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

http://jdbi.org/sql_object_api_queries/

+0

要显示的代码正确要么缠上反引号短snippits(离开你1个键)'像this'或开始带有4个(或更多)空格的行。 – indivisible

+0

我对JDBI并不熟悉,但文档提到基于[ResultSetMapper](http://jdbi.org/apidocs/org/skife/jdbi/v2/tweak/ResultSetMapper.html)接口创建一个类,并且使用'handle.create(“select * from sometable”).map(MyMapper)''命令传递它。 – Powerlord

+0

话虽如此,我很惊讶你不使用像[Hibernate ORM] [JPA](http://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html)实现, (http://hibernate.org/orm/)如果你想处理对象。 – Powerlord

回答

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")); 
    } 

} 

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

+0

谢谢,它的工作原理。我刚刚发现我使用的是JDBI 2.9.4版本,而v2.53实际上是最新版本。我不知道版本列表会发生什么情况。无论如何,谢谢你的帮助。 – ringord

相关问题