簡體   English   中英

JDBI,模型映射器和SQL對象查詢

[英]JDBI, Model Mapper and SQL Object Queries

我在JDBI中使用模型映射器,但是在SQL對象查詢中不能使用模型映射器。

例如我有這個選擇

@SqlQuery("select * from example")

和文檔說我必須使用ResultSetMapper或ResultSetMapperFactory來映射結果。 我想編寫一個使用模型映射器的映射器,但是如果可以的話,我有一些問題需要理解(下面的代碼不起作用)。 這是ExampleMapper類中的方法(與SqlObject @RegisterMapper(ExampleMapper.class)使用的注釋是@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? 謝謝,西爾維亞

問題在於,modelmapper的“ map”方法可以在一次調用中處理結果集中的所有記錄,而jdbi的“ map”函數希望“ map”方法一次可以處理單個結果行。 最終結果是,模型映射器在第一次調用時便貪婪地讀取結果集中的所有記錄。 這將導致結果集在傳遞回modelmapper時已經關閉,因此jdbi會引發錯誤。

但是,這很容易分兩步完成,雖然不那么整齊,但是比弄亂jdbi或modelmapper的代碼要容易得多。 最終結果就是我想要的-從數據庫到Java的非常簡單的方法,而無需手動輸入大量的字段名稱來進行映射。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM