如何将 DBUtils 结果集转换为由更多域对象组合而成的 JavaBeans?

Posted

技术标签:

【中文标题】如何将 DBUtils 结果集转换为由更多域对象组合而成的 JavaBeans?【英文标题】:How to transform DBUtils resultset into JavaBeans composited from more domain objects? 【发布时间】:2013-02-25 16:25:00 【问题描述】:

我正在 Spring Framework 中创建 MVC Web 应用程序,我需要将 Apache 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 对象中使用这个行处理器,以及这个实现是否正确?


我通常以这种方式将行转换为 JavaBean:

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

但在我的情况下,首先需要创建嵌套对象,然后创建最终的 JavaBean,所以我假设我需要自定义行处理器。


我的域对象的结构是:

MonthOrderCount 类:

public class MonthOrderCount     
    private Month month;
    private int orderCount;

月班:

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 变量已正确填充,但月份在所有情况下都为空。对我来说最奇怪的是 - toBean() 方法永远不会被调用。

2013-03-10 17:09:46 INFO ChartDataService:29 - [MonthOrderCountmonth=null, orderCount=1863, MonthOrderCountmonth=null, orderCount=2262, MonthOrderCountmonth=null, orderCount=2531, MonthOrderCountmonth=null, orderCount=2379, MonthOrderCountmonth=null, orderCount=2106, MonthOrderCountmonth=null, orderCount=1498, MonthOrderCountmonth=null, orderCount=1300, MonthOrderCountmonth=null, orderCount=1578, MonthOrderCountmonth=null, orderCount=2385, MonthOrderCountmonth=null, orderCount=2991, MonthOrderCountmonth=null, orderCount=2219, MonthOrderCountmonth=null, orderCount=1943, MonthOrderCountmonth=null, orderCount=264]

【问题讨论】:

【参考方案1】:

如果要将结果集转换为 JavaBean 列表,则需要覆盖 toBeanList() 而不是 toBean() 方法。

最终处理程序类被覆盖的 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;

    

我希望它对某人有所帮助。

【讨论】:

以上是关于如何将 DBUtils 结果集转换为由更多域对象组合而成的 JavaBeans?的主要内容,如果未能解决你的问题,请参考以下文章

将 simplejdbccall 结果集转换为 java 对象

batch工程中apache的dbutils包

DBUtils结果集处理

JPA:如何将原生查询结果集转换为 POJO 类集合

Apache DbUtils:处理从存储过程返回的多个结果集

DBUtils框架的使用(下)