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?谢谢Silvia

问题是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对映射列表非常满意,因此在代码的其他地方使用ModelMapper将结果转换为所需的类型。为此,我在JDBI-Sql对象接口周围封装了一个真正的DAO,因此JDBI接口是隐藏的。转换本身——这可以用一个通用方法来完成,您可以在任何到beans/pojo列表的转换中重复使用该方法。

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

最新更新