【问题标题】:ParameterizedRowMapper That Maps Object List to Object将对象列表映射到对象的 ParameterizedRowMapper
【发布时间】:2013-03-11 09:55:39
【问题描述】:

我正在尝试在 ParameterizedRowMapper 中设置父列表,这是如何编写或处理的。我有两个对象,一个用于父对象,一个用于子对象,但是子对象包含一个列表每个子对象的父对象都存储在数据库中的单独表中,并且映射为 1 - 多。

父项记录的选择将在单独的 ResultSet 中完成。映射是否必须单独完成(单独的 ParameterizedRowMapper),如果是这样,我将如何编写 ParameterizedRowMapper 这是主要关注如何 ParameterizedRowMapper 被写入以容纳列表项。

ParameterizedRowMapper

public static class ChildrenMapper implements ParameterizedRowMapper<Children>{         

         public Children mapRow(ResultSet rs, int rowNum) throws SQLException {
                Children child = new Children();
                child.setFirstName(rs.getString("firstName"));
                child.setLastName(rs.getString("lastName"));
                    //a child can have many Parents or gaurdians
                child.setParent(List<Parent>);                  

                return child;
            }       
    }

根据我的研究,我发现我需要使用 ResultSetExtractor,但是我对它的使用有疑问。我是否在设置父级时将其集成到班级中?有人可以指导我如何正确地完成它

Children.java

Public class Children(){
int cid;
String firstName;
String lastName;
List<Parent>parents;
..

//getters/setters

}

Parent.java

Public class Parent(){
 int pid;
String firstName;
String lastName;
..

//setters/getters
}

【问题讨论】:

    标签: java spring spring-mvc parameterized sqlresultsetmapping


    【解决方案1】:

    我将展示如何为典型的一对多示例执行此操作,您可以将其调整为您的 vo 类/表。

    订单类

    public class Order {
        private Long orderId;
        private String user;
        private List<LineItem> items;
        // Getter / setter omitted
    }
    

    物品类别

    public class LineItem {
        private Long lineItemId;
        private String product;
        private int quantity;
        // Getter / setter omitted
    }
    

    为每个类使用两个行映射器,然后使用结果集提取器将多行转换为一个订单+行项目

    订单仓库

    public final static RowMapper<Order> orderMapper = ParameterizedBeanPropertyRowMapper.newInstance(Order.class);
    public final static RowMapper<LineItem> lineItemMapper = ParameterizedBeanPropertyRowMapper.newInstance(LineItem.class);
    
    public Order findOrderWithItems(Long orderId) {
        return jdbcTemplate.query("select * from orders, line_item "
                + " where orders.order_id = line_item.order_id and orders.order_id = ?", 
                new ResultSetExtractor<Order>() {
            public Order extractData(ResultSet rs) throws SQLException, DataAccessException {
                Order order = null;
                int row = 0;
                while (rs.next()) {
                    if (order == null) {
                        order = orderMapper.mapRow(rs, row);
                    }
                    order.addItem(lineItemMapper.mapRow(rs, row));
                    row++;
                }
                return order;
            }
    
        }, orderId);
    }
    
    public List<Order> findAllOrderWithItmes() {
        return jdbcTemplate.query("select * from orders, line_item "
                + " where orders.order_id = line_item.order_id order by orders.order_id",
                new ResultSetExtractor<List<Order>>() {
                    public List<Order> extractData(ResultSet rs) throws SQLException, DataAccessException {
                        List<Order> orders = new ArrayList<Order>();
                        Long orderId = null;
                        Order currentOrder = null;
                        int orderIdx = 0;
                        int itemIdx = 0;
                        while (rs.next()) {
                            // first row or when order changes
                            if (currentOrder == null || !orderId.equals(rs.getLong("order_id"))) {
                                orderId = rs.getLong("order_id");
                                currentOrder = orderMapper.mapRow(rs, orderIdx++);
                                itemIdx = 0;
                                orders.add(currentOrder);
                            }
                            currentOrder.addItem(lineItemMapper.mapRow(rs, itemIdx++));
                        }
                        return orders;
                    }
    
                });
    }
    

    【讨论】:

    • 我没有测试过。它应该与一些小的调整一起工作 - 特别是如果在两个表中都有相同名称的列..
    • 你可以在github.com/gkamal/jdbc-template-one-to-many找到一个工作版本
    • 不会编译。 RowMapper 不是通用的
    • 使用 spring 3.0 或更高版本或摆脱泛型并替换为强制转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多