JdbcTemplate如何使用Mapper返回List并在Mapper中实现RowMapper?

时间:2018-09-07 02:13:33

标签: java spring jdbctemplate

晚上好,我正在尝试使用控制器/ Service / Dao / DaoImpl /和Mapper实现jdbctemplate模型。 但是通过模型,我看到映射器需要实现RowMapper或ParameterizedRowMapper,并且两者都具有不返回List的maprow方法。当我需要一个列表时,我在映射器中实现了一个方法来获取所需的列表。但我不知道该怎么称呼。 在customerList方法中,我必须像这样在查询内部传递CustomerMapper:

jdbcTemplate.query(SQL,新的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次购买的购买对象(而非客户)列表。

现在了解了吗?

我将为更好地理解提供示例。

感谢您的回答!

3 个答案:

答案 0 :(得分: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将所有行转换为Customer的列表。 JdbcTemplate将透明地执行此操作,因此您无需担心。

编辑:

编辑后,您要解释的是,您需要从purchases表中获取给定客户的购买信息列表。在这种情况下,您实际上需要一个PurchaseRowMapper。这将映射来自purchases表中的记录,该记录具有一个名为(也许)PurchaseInformation的类。这将返回PurchaseInformation个对象的列表。

答案 1 :(得分: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

答案 2 :(得分:-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;
  }
}

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