Mapping 在dropwizard中动态映射到对象的结果集

Mapping 在dropwizard中动态映射到对象的结果集,mapping,resultset,dropwizard,jdbi,Mapping,Resultset,Dropwizard,Jdbi,我试图将ResultSet数据映射到一个对象并返回它。下面是我如何将数据映射到对象的。现在我在resultset中只有7列,所以这很好,但是如果我有20或30列呢。如何动态映射这些列 public class ProductsWrapperMapper implements ResultSetMapper<ProductsWrapper> { public ProductsWrapper map(int i, ResultSet resultSet,

我试图将ResultSet数据映射到一个对象并返回它。下面是我如何将数据映射到对象的。现在我在resultset中只有7列,所以这很好,但是如果我有20或30列呢。如何动态映射这些列

public class ProductsWrapperMapper implements ResultSetMapper<ProductsWrapper> {
    public ProductsWrapper map(int i, ResultSet resultSet,
            StatementContext statementContext) throws SQLException {
        ProductsWrapper product = new ProductsWrapper();    

        if ((isColumnPresent(resultSet,"a_productid"))) {
            product.setId(resultSet.getInt("a_productid"));

        }
        if ((isColumnPresent(resultSet,"a_productname"))) {
            product.setProductName(resultSet.getString("a_productname"));
        }
        if ((isColumnPresent(resultSet,"a_productlink"))) {
            product.setLink(resultSet.getString("a_productlink"));
        }
        if ((isColumnPresent(resultSet,"a_productimagelink"))) {
            product.setImageLink(resultSet.getString("a_productimagelink"));
        }
        if ((isColumnPresent(resultSet,"a_websiteid"))) {
            product.setWebsiteId(resultSet.getInt("a_websiteid"));
        }
        if ((isColumnPresent(resultSet,"a_productidentification"))) {
            product.setProductIdentification(resultSet
                    .getString("a_productidentification"));
        }
        if ((isColumnPresent(resultSet,"a_adddate"))) {
            product.setAddDate(resultSet.getString("a_adddate"));
        }

        return product;
    }


    public boolean isColumnPresent(ResultSet resultSet,String column) {
        try {
            @SuppressWarnings("unused")
            int index = resultSet.findColumn(column);
            return true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            return false;
        }

    }
}
您可以添加作为JDBI结果集的映射器(它也适用于绑定)。看一下将带下划线的列名映射到snake-case java名称的高级功能

请注意,如果Rosetta无法映射值,则不会出现警告消息:目标bean中丢失的任何属性都将是空的。我发现我的数据库返回了大写的列名,因此示例中的
小写策略
对我不起作用。我创建了一个带下划线的大写策略


要跳过在ProductsRapper中编写getter和setter,请查看的
@Data
注释。

您也可以尝试。它自动处理动态备份,还提供一对多映射关系。

Hi-对于自动映射,您通常会使用hibernate之类的框架来完成。Dropwizard也提供了hibernate扩展。好的,有没有其他方法不用hibernate就可以做到这一点,因为我的项目中没有使用hibernate.Hm。如果您的列名与字段名相同,则可以使用反射。或者您可以使用Hashmap存储字段值,并将列名作为键。谢谢您的回复。我会尝试实现它。@pandaadb我无法理解如何实现您建议的方法。请您解释一下如何实现这些方法。非常感谢Manikandan。我得到了结果。如何在jbdi中编写动态sql查询。就像在我的项目中,客户会询问一些细节,如“名字、姓氏、手机…”。所以我将这些值读入字符串,我的想法是直接将其附加到sql查询中,比如“选择firstname、lastname、mobile from customer”,但我没有得到它。我通过向项目中添加依赖项来检查它。在添加它并运行该项目之后,我得到了NoSuchMethodFound异常。
@JsonInclude(Include.NON_NULL)
public class ProductsWrapper {

    private int id;
    private String productName;
    private String link;
    private String imageLink;
    private int websiteId;
    private String productIdentification;
    private String addDate;

    int getWebsiteId() {
        return websiteId;
    }

    public void setWebsiteId(int websiteId) {
        this.websiteId = websiteId;
    }

    public String getProductIdentification() {
        return productIdentification;
    }

    public void setProductIdentification(String productIdentification) {
        this.productIdentification = productIdentification;
    }

    public String getAddDate() {
        return addDate;
    }

    public void setAddDate(String addDate) {
        this.addDate = addDate;
    }`enter code here`

    public ProductsWrapper(int id) {
        this.setId(id);
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getImageLink() {
        return imageLink;
    }

    public void setImageLink(String imageLink) {
        this.imageLink = imageLink;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}