2013-03-10 52 views
2

我在Spring框架中創建MVC Web應用程序,我需要將行從Apache DBUtils結果集轉換爲由嵌套對象組成的JavaBean。如何將DBUtils結果集轉換爲從更多的域對象合成的JavaBeans?

關於我發現的很少的例子,我創建了這個RowProcessor實現。

public class MonthOrderCountHandler extends BasicRowProcessor { 

    @Override 
    public Object toBean(ResultSet rs, Class type) throws SQLException { 

     // Year 
     Year year = new Year(); 
     year.setYearNo(rs.getInt("yearNo")); 
     year.setYear4(rs.getString("year4")); 
     year.setYear2(rs.getString("year2")); 

     // Quarter 
     Quarter quarter = new Quarter(); 
     quarter.setQuarter(rs.getInt("quarter")); 

     // Month 
     Month m = new Month(); 
     m.setYear(year); 
     m.setQuarter(quarter); 
     m.setMonthAbbreviation(rs.getString("monthAbbreviation")); 
     m.setMonthName(rs.getString("monthName")); 
     m.setMonthNo(rs.getInt("monthNo")); 

     // Final bean 
     MonthOrderCount result = new MonthOrderCount(); 
     result.setMonth(m); 
     result.setOrderCount(rs.getInt("orderCount")); 

     return result; 

    } 
} 

問:我想知道,知道如何在我的DAO對象,如果這個實現是正確使用此行處理器?


通常我變換行成的JavaBeans這樣:

ResultSetHandler<List<MonthOrderCount>> listUrlHandler = new BeanListHandler<>(MonthOrderCount.class); 

但在我的情況第一Ineed創建嵌套的對象,然後創建一個最終的JavaBean,所以我想我需要自定義行處理器。我的域對象的


結構是:

MonthOrderCount類:

public class MonthOrderCount {  
    private Month month; 
    private int orderCount; 
} 

Month類:

public class Month { 
    private Quarter quarter; 
    private Year year; 
    private int monthNo; 
    private String monthName; 
    private String monthAbbreviation; 
} 

季度類:

public class Quarter { 
    private int quarter; 
    private String abbreviation; 
} 

年等級:

public class Year { 
    private int yearNo; 
    private String year2; 
    private String year4; 
} 

編輯:我問,因爲我的結果看起來是這樣的。 orderCount變量已正確填充,但在所有實例中month都爲空。對我來說什麼是最奇怪的 - toBean()方法永遠不會被調用。

2013年3月10日17時09分46秒INFO ChartDataService:29 - [MonthOrderCount {一個月= NULL,定單計數= 1863}, MonthOrderCount {一個月= NULL,定單計數= 2262}, MonthOrderCount {月= NULL,定單計數= 2531}, MonthOrderCount {一個月= NULL,定單計數= 2379}, MonthOrderCount {一個月= NULL,定單計數= 2106}, MonthOrderCount {一個月= NULL,定單計數= 1498}, MonthOrderCount {月=空,orderCount = 1300}, MonthOrderCount {month = null,orderCount = 1578}, MonthOrderCount {month = null,orderCount = 2385}, MonthOrderCount {month = null,orderCount = 2991}, MonthOrderCount {月= NULL,定單計數= 2219}, MonthOrderCount {月= NULL,定單計數= 1943年}, MonthOrderCount {月= NULL,定單計數= 264}]

回答

3

如果您要變換的結果集到需要重寫toBeanList()而不是toBean()方法的JavaBean列表中。overrided BasicRowProcessor

最終處理類看起來是這樣的:

public class MonthOrderCountHandler extends BasicRowProcessor { 

    @Override 
    public List toBeanList(ResultSet rs, Class clazz) { 
     try { 
      List newlist = new LinkedList(); 
      while (rs.next()) { 
       newlist.add(toBean(rs, clazz)); 
      } 
      return newlist; 
     } catch (SQLException ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

    @Override 
    public Object toBean(ResultSet rs, Class type) throws SQLException { 

     // Year 
     Year year = new Year(); 
     year.setYearNo(rs.getInt("yearNo")); 
     year.setYear4(rs.getString("year4")); 
     year.setYear2(rs.getString("year2")); 

     // Quarter 
     Quarter quarter = new Quarter(); 
     quarter.setQuarterNo(rs.getInt("quarterNo")); 

     // Month 
     Month m = new Month(); 
     m.setYear(year); 
     m.setQuarter(quarter); 
     m.setMonthAbbreviation(rs.getString("monthAbbreviation")); 
     m.setMonthName(rs.getString("monthName")); 
     m.setMonthNo(rs.getInt("monthNo")); 

     // Final bean 
     MonthOrderCount result = new MonthOrderCount(); 
     result.setMonth(m); 
     result.setOrderCount(rs.getInt("orderCount")); 

     return result; 

    } 
} 

我希望它可以幫助別人。

相關問題