当前位置: 首页 > 知识库问答 >
问题:

如何使用JdbcTemplate返回列表在映射器中实现行映射器?

斜昊空
2023-03-14

大家晚上好,我正在尝试用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次购买。

现在明白了吗?

我将为更好的理解树立榜样。

谢谢你的回答!

共有3个答案

司寇研
2023-03-14

行映射器实现:

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解释。

萧萧迟
2023-03-14

我已经找到了解决办法。。。此示例使用另一个实体,但它可以工作!

           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
东方旺
2023-03-14

似乎问题在于对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 任何人都可以提供我的代码可能出错的地方?谢谢!

  • 问题内容: 我目前正在尝试制作一个将动词与西班牙语共轭的程序。我创建了一个哈希表,其中包含一个键和对象Ve​​rb的实例化。键是具有动词不定式形式的字符串(例如“ hablar”)。这是到目前为止我对哈希映射的代码: HashMap中每个动词的键都基于动词的不定式形式。例如,字符串“ hablar”是西班牙语动词的键。Verb类具有一个名为getInfinitive()的方法,该方法返回一个字符串

  • 我想用Kotlin中的Mapstruct将实体映射到带有嵌套DTO的DTO。 在Java中,这是这样的:。 应该如何使用Kotlin实现它?

  • 输入是一个哈希映射,比如 我想写一个方法,返回类型A的列表,其中有键,值属性与字符串类型,和键值从hashmap。 如何让它成为现实?