大家晚上好,我正在尝试用controller/Service/Dao/DaoImpl/和Mapper实现一个jdbctemplate模型。。。但从模型来看,映射器需要实现RowMapper或ParameterizedRowMapper,两者都有一个不返回列表的maprow方法。当我需要一个列表时,我在映射器中实现了一个方法来获得我需要的列表。但我不知道该怎么称呼它。在customerList方法中,我必须在查询中传递CustomerMapper,如下所示:
jdbcTemplate。查询(sql,新CustomerMapper(),id);
客户映射器必须实现行映射器或参数化行映射器,以便jdbcTemplate。query接受它,maprow方法必须与RowMapper或parameteredrowmapper一起出现。
当我在输入CustomerMapper类时通过listCustomer调用Mapper方法时,它会自动输入第一个mapRow方法,而不会输入我希望listCustomer返回我所需列表的方法。
你知道怎么帮我吗?
我需要返回一份客户名单。就这个!但按照这种形式的实施。。。
非常感谢。
我的班级:
@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次购买。
现在明白了吗?
我将为更好的理解树立榜样。
谢谢你的回答!
行映射器实现:
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解释。
我已经找到了解决办法。。。此示例使用另一个实体,但它可以工作!
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
似乎问题在于对RowMapper的理解。
由于Jdbc不知道如何将行映射到对象,所以它要求您进行映射。因此,行映射器的唯一责任就是提供这种映射。没有别的了。更改地图行,如下所示。
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将应用此映射器将行映射到对象。如果有多行,它将使用此行映射器将所有行转换为客户的列表。JdbcTemplate将透明地执行此操作,因此您无需担心。
编辑:
编辑后,您将解释您需要来自给定客户的购买
表的购买信息列表。对于这种情况,您实际上需要一个PurchaseRowMapper
。这将从您的购买
表中映射一条记录,该记录带有名为(可能)PurchaseInformation
的类。这将返回您一个PurchaseInformation
对象的列表。
目前我有一个DAO在做这样的事情: 而映射器则执行如下操作:(简化为该问题所需的内容) 作为JsonB字段存储在Aurora中。我读过一些关于注释的文章,但由于jdbi文档不清楚,所以我不确定这是否正确。 我映射结果的方式是“标准”方式吗?还是有更好/更有效的方式? 谢谢
我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!
问题内容: 我目前正在尝试制作一个将动词与西班牙语共轭的程序。我创建了一个哈希表,其中包含一个键和对象Verb的实例化。键是具有动词不定式形式的字符串(例如“ hablar”)。这是到目前为止我对哈希映射的代码: HashMap中每个动词的键都基于动词的不定式形式。例如,字符串“ hablar”是西班牙语动词的键。Verb类具有一个名为getInfinitive()的方法,该方法返回一个字符串
我想用Kotlin中的Mapstruct将实体映射到带有嵌套DTO的DTO。 在Java中,这是这样的:。 应该如何使用Kotlin实现它?
输入是一个哈希映射,比如 我想写一个方法,返回类型A的列表,其中有键,值属性与字符串类型,和键值从hashmap。 如何让它成为现实?