Каким образом JdbcTemplate возвращает List с помощью RowMapper в Mapper? - PullRequest
0 голосов
/ 07 сентября 2018

Добрый вечер, ребята, я пытаюсь реализовать модель jdbctemplate с контроллером / Service / Dao / DaoImpl / и Mapper ... Но в моделях, которые я вижу, картограф должен реализовать RowMapper или ParameterizedRowMapper, и оба имеют метод maprow, который не возвращает List. Поскольку мне был нужен список, я реализовал метод в маппере, чтобы получить нужный мне список. но я не знаю как это назвать. В методе customerList я должен передать CustomerMapper внутри запроса следующим образом:

jdbcTemplate.query (sql, новый CustomerMapper (), id);

И клиентский маппер должен реализовать RowMapper или ParameterizedRowMapper, чтобы jdbcTemplate.query принимает его и вместе с RowMapper или ParameterizedRowMapper должен прийти метод maprow.

Когда я вызываю метод Mapper через listCustomer при входе в класс CustomerMapper, он автоматически входит в первый метод 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 ]

0 голосов
/ 07 сентября 2018

Реализация 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.

0 голосов
/ 07 сентября 2018

Я нашел решение ... этот пример с другим объектом, но он работает!

           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
0 голосов
/ 07 сентября 2018

Похоже, проблема заключается в понимании 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 будет применять этот сопоставитель для сопоставления строки с объектом. Если у вас есть несколько строк, он преобразует все строки в список Customer s, используя этот rowMapper. JdbcTemplate сделает это прозрачно, так что вам не нужно об этом беспокоиться.

Edit:

После редактирования вы объясняете, что вам нужен список информации о покупке из таблицы purchases для данного клиента. Для этого случая вам действительно нужен PurchaseRowMapper. Это сопоставит запись из вашей таблицы purchases с именем класса (возможно) PurchaseInformation. Это вернет вам список PurchaseInformation объектов.

...