2014-04-14 65 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

相關問題