2013-03-10 55 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; 

    } 
} 

我希望它可以帮助别人。

相关问题