JdbcTemplate如何在Mapper中使用implements RowMapper返回List?

问题描述 投票:0回答:3

晚上好,我正在尝试用controller / Service / Dao / DaoImpl /和Mapper实现一个jdbctemplate模型......但是通过模型,我看到mapper需要实现RowMapper或ParameterizedRowMapper,并且两者都有一个maprow方法,而不是返回一个List。因为我需要一个List,我在mapper中实现了一个方法来获取我需要的列表。但我不知道该怎么称呼它。在customerList方法中,我必须在查询中传递CustomerMapper,如下所示:

jdbcTemplate.query(sql,new CustomerMapper(),id);

并且客户映射器必须实现RowMapper或ParameterizedRowMapper,以便jdbcTemplate.query接受它,并且与RowMapper或ParameterizedRowMapper一起使用maprow方法。

当我在进入CustomerMapper类时通过listCustomer调用Mapper方法时,它会自动输入第一个mapRow方法,并且不会输入我想要的listCustomer返回我需要的List的方法。

知道怎么帮我这么做吗?

我需要返回一份客户名单。只是这个!但是遵循这种形式的实施......

谢谢!

我的课:

@Controller
public class CustomerController {

    @Autowired
    private CustomerService customerService;

    @ResponseBody
    @RequestMapping(value = "/customer/{id}", method = RequestMethod.GET)
    public Map<String, Object> searchCustomer(@PathVariable(value="id") Long id, 
            final HttpServletRequest request) throws IOException, SQLException {

        Map<String, Object> map = new HashMap<String, Object>();

        List<Customer> customerList = customerService.searchCustomer(id);

        map.put("customer", customerList);

        return map;
    }


}
SERVICE
@Service
public class CustomerService {

    @Autowired
    private CustomerDAO dao;

    public List<Customer> searchCustomer(Long id) throws SQLException {

        return dao.listCustomer(id);

    }

}

DAO
public interface CustomerDAO {


    List<Customer> listCustomer(Long id);

}

DAOIMPL
public class CustomerDAOImpl implements CustomerDAO {

    @Autowired
    private SimpleJdbcTemplate jdbcTemplate;    
    String sql = "SELECT  * FROM purchases C WHERE C.ID = ?";


    public List<Customer> listCustomer(Long id) {
        return jdbcTemplate.query(sql, new CustomerMapper(), id);
    }

}

//MAPPER
public class CustomerMapper implements RowMapper<Customer>{


    public Customer mapRow(ResultSet rs, int arg1) throws SQLException {

        ... "N" RULES INSIDE BUT DONT RETURN ArrayList OR LIST.... ANYAWAY..


        //THIS METHOD IS INTERFACE INHERITANCE AND HAS TO BE IMPLEMENTED
        //BUT I NEED A METHOD THAT RETURNS A LIST OF CUSTOMERS FOR THE CONTROLLER
        //AND THEREFORE IT RETURNS JUST 1 CUSTOMER 

    }

    //SO I CREATED THIS OTHER METHOD THAT RETURNS A LIST OF CUSTOMERS AND 
    //IMPLEMENTED IN THE INTERFACE ... BUT I DO NOT KNOW HOW THE MAPPER CALLS IT ...
     //NOT MAPROW
    public List<Customer> listCustomer(ResultSet rs, int arg1) throws SQLException {

        List<Customer> customerList = new ArrayList<Customer>();

        Customer customer = new Customer();

        while (rs.next()) {
            if (rs.getString("ID") != null)
            customer.setEtpId(rs.getString("ID"));
            ......
            ......
            customerList.add(customer);
        }

        return customerList;

    }

}

对不起,我没有对一个例子进行全面查询,但如果解释得不好,我很抱歉。那么,我需要的是通过客户编号在购买表中进行选择,并向我提供该客户的所有购买。

例如。

Select * from table purchases p where p.customerid = 4;

这将是查询,所以让我们假设它返回5条记录。我希望映射器返回一个购买对象(不是客户)的列表,其中包含该客户所做的5次购买。

现在明白了吗?

我将树立榜样以便更好地理解。

谢谢你的回答!

java spring jdbctemplate
3个回答
1
投票

似乎问题在于对RowMapper的理解。

因为,Jdbc不知道你想如何将你的行映射到一个对象,它会要求你进行映射。所以RowMapper的唯一责任是提供这种映射。没有其他的。像下面这样改变你的mapRow

public Customer mapRow(ResultSet rs, int arg1) throws SQLException {

     Customer customer = null;

     if (rs.getString("ID") != null){
        customer = new Customer()
        customer.setEtpId(rs.getString("ID"));
        ......
        ......
     }
     return customer;
}

JdbcTemplate将应用此映射器来映射具有对象的行。如果您有多行,它将使用此rowMapper将所有行转换为Customers列表。 JdbcTemplate将透明地执行此操作,因此您无需担心它。

编辑:

在您编辑之后,您正在解释您需要purchases表中针对给定客户的购买信息列表。对于这种情况,你实际上需要一个PurchaseRowMapper。这将从你的purchases表中映射一个名为(也许)PurchaseInformation的类。这将返回一个PurchaseInformation对象列表。


0
投票

我找到了解决方案......这个例子与另一个实体有关,但它有效!

           String sqlSelectQuery = "SELECT name, email, address, telephone FROM contact";
52
            List listContacts = jdbcTemplateObj.query(sqlSelectQuery, new RowMapper() {
53
                public Contact mapRow(ResultSet result, int rowNum) throws SQLException {
54
                    Contact contactObj = new Contact();
55
                    contactObj.setName(result.getString("name"));
56
                    contactObj.setEmail(result.getString("email"));
57
                    contactObj.setAddress(result.getString("address"));
58
                    contactObj.setPhone(result.getString("telephone"));
59
                    return contactObj;
60
                }
61
            });
62

63
            // Displaying The SQL Records
64
            for (Contact contactDetail : listContacts) {
65
                System.out.println(contactDetail.toString());
66
            }
67

-1
投票

Rowmapper实施:

public class CustomerMapper implements RowMapper<Customer>{

  List<Customer> customerList = new ArrayList<Customer>();

 public Customer mapRow(ResultSet rs, int arg1) throws SQLException {      
  Customer customer = new Customer();
    while (rs.next()) {
        if (rs.getString("ID") != null)
        customerList.add(rs.getString("ID"));
    }
    customer.setEtpId(customerList);
    return customer;
  }
}

上面的代码将返回客户列表。有关rowMapper的解释,请参阅https://stackoverflow.com/a/27593565/2695504RowMapper vs ResultSet

© www.soinside.com 2019 - 2024. All rights reserved.