2016-03-11 1 views
0

Я пытался сопоставить данные ResultSet с объектом и вернуть его. Вот как я сопоставляю данные с объектом. Теперь у меня всего 7 столбцов в наборе результатов, так что это нормально работает, но что, если у меня 20 или 30 столбцов. Как я могу динамически сопоставить эти столбцы.ResultSet сопоставление объекта динамически в dropwizard

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

    } 
} 

Ниже приведен мой класс, в котором я возвращал объект из класса сопоставления выше.

@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; 
    } 
} 
+0

Привет - для автоматического сопоставления вы обычно использовали бы фреймворки, такие как спящий режим, для этого. Dropwizard также предлагает расширение для спящего режима. – pandaadb

+0

отлично, есть ли другой способ сделать это, не используя спящий режим, потому что я не использую спящий режим в моем проекте. – Nike

+0

Hm. В верхней части головы, если имена столбцов совпадают с именами полей, вы можете использовать отражение для этого. Или вы можете использовать Hashmap для хранения значений полей и иметь имя столбца в качестве ключа. – pandaadb

ответ

0

Вы также можете попробовать Jdbi-folder. Он автоматически заботится о динамическом подходе, а также обеспечивает отношение ко многим отношениям.

+0

Большое спасибо Manikandan. Я получил результат. – Nike

+0

Как написать динамический SQL-запрос в jbdi. как и в моем проекте, клиент будет запрашивать некоторые детали, такие как «firstname, lastname, mobile ...». поэтому я буду читать эти значения в строке, и моя идея была непосредственно добавлена ​​к sql-запросу, например «select firstname, lastname, mobile from customer», но я не получаю его. – Nike

0

Вы можете добавить Rosetta в качестве картографа для ваших наборов результатов JDBI (он также работает для привязки). Просмотрите расширенные функции для сопоставления имен столбцов с символами подчеркивания java-имен змеиных змей.

Остерегайтесь, чтобы не было предупреждающего сообщения, если Rosetta не может сопоставить значение: любое пропущенное свойство в целевом компоненте будет пустым. Я обнаружил, что моя база данных вернула имена столбцов заглавными буквами, поэтому LowerCaseWithUnderscoresStrategy в примере не работал для меня. Я создал UpperCaseWithUnderscoresStrategy.

Чтобы пропустить создание геттеров и сеттеров в ProductsWrapper, обратите внимание на Lombok's @Data аннотация.

+0

Я проверил его, добавив зависимость от моего проекта. После добавления этого и запуска проекта я получаю исключение NoSuchMethodFound. – Nike