0

我将模型映射器与 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);
}

如何使用模型映射器映射结果集?谢谢, 西尔维娅

4

1 回答 1

1

问题是 modelmapper 'map' 方法在一次调用中处理结果集中的所有记录,而 jdbi 'map' 函数期望 'map' 方法一次处理单个结果行。最终结果是模型映射器在第一次调用时贪婪地读取结果集中的所有记录。这会导致结果集在传递回 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 接口。转换本身可以使用通用方法完成,您可以将其重新用于任何转换为​​ beans/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));
}
于 2015-12-24T17:13:59.387 回答