2015-11-16 68 views
0

我正在使用帶有JDBI的模型映射器,但我無法將模型映射器用於SQL對象查詢。JDBI,模型映射器和SQL對象查詢

比如我有這樣的選擇

@SqlQuery("select * from example") 

和文檔說,我必須使用ResultSetMapper或ResultSetMapperFactory映射的結果。 我想編寫一個使用模型映射器的映射器,但我有一些問題需要了解,如果我可以(下面的代碼不起作用)。 這裏是在ExampleMapper類中的方法(註釋與SQLObject的使用是 @RegisterMapper(ExampleMapper.class)

public ExamplePO map(int index, ResultSet r, StatementContext ctx) throws SQLException{ 
    System.out.println("rs: " + r.getString("id_Example")); 
    ModelMapper mapper = new ModelMapper(); 
    mapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.UNDERSCORE); 
    return mapper.map(r, ExamplePO.class); 
} 

我該如何映射使用模型映射的resultSet? 謝謝, 西爾維婭

回答

1

的問題是,所述modelmapper「地圖」方法處理的結果集的所有記錄在一個呼叫,而jdbi「地圖」函數需要「地圖」的方法來在處理一個單一的結果列一次。最終效果是模型映射器在第一次調用時貪婪地讀取結果集中的所有記錄。這會導致結果集在返回到modelmapper時已經關閉,所以jdbi會拋出錯誤。

但是,這很容易在兩個步驟中完成,這不是很簡單,但比搞亂jdbi或modelmapper的代碼更容易。最終的結果就是我想要的 - 從數據庫到Java的非常簡單的方法,無需手動輸入字段名稱負載進行映射。

第一步是對sql對象的api接口聲明使用默認映射器,它將返回一個地圖列表。

@SqlQuery("select product_id, title from product where product_id = :id ") 
@Mapper(DefaultMapper.class) 
public List<Map<String, Object>> getProductDetails(@Bind("id") long id); 

ModelMapper很高興與地圖的列表,以便在其他地方在代碼中使用的模型映射到的結果轉換爲所需的類型。我已經在JDBI Sql對象接口周圍包裝了一個真正的DAO,因此隱藏了jdbi接口。轉換本身可以通過一個通用的方法完成,您可以重新使用它來轉換爲bean/pojos列表。

public static <T> List<T> map(Class<T> clazz, List<Map<String, Object>> data) { 

    ModelMapper modelMapper = new ModelMapper(); 
    modelMapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.UNDERSCORE); 
    List<T> result = modelMapper.map(data, new TypeToken<List<T>>() {}.getType()); 
    return result; 
} 

public List<Product> getProductDetails(long id) { 
    return ListMapper.map(Product.class, productDBI.getProductDetails(id)); 
}