晚上好,我正在尝试使用控制器/ 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次购买的购买对象(而非客户)列表。
现在了解了吗?
我将为更好地理解提供示例。
感谢您的回答!
答案 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/2695504或RowMapper vs ResultSet以获得rowMapper的解释。