Как именно работает интерфейс Spring RowMapper?

Я учусь на сертификацию Spring Core, и у меня есть некоторые сомнения относительно того, как Spring обрабатывает запросы JDBC:

Итак, я знаю, что могу получать данные из своих таблиц БД различными способами в зависимости от типа данных, которые я ожидаю получить:

1) Запрос дляпростой тип (как int, long или String): я используюqueryForObject () методJdbcTemplate класс, как то так:

String sql = "SELECT count(*) FROM T_REWARD";
int rowsNumber = jdbcTemplate.queryForObject(sql, Integer.class);

Таким образом, чтобы получить простой объект в качестве значения int, я используюqueryForObject () метод, передавая емуsql устав и тип объекта, который я ожидаю получить на выходе из метода.

Хорошо, это довольно просто, и я думаю, что все в порядке.

2) Запрос длявся строка таблицы положить вкарта объект: так что, если мне не нужно единственное значение (которое может быть в одном столбце определенной строки таблицы или что-то вроде предыдущего примера), я могу использоватьqueryForMap (..) иqueryForList () методы, таким образом:

2,1)queryForMap (): Я использую это, если я ожидаюодин ряд положить водин объект карты где значение каждого столбца отображается в моей карте, что-то вроде:

String sql = "select * from T_REWARD where CONFIRMATION_NUMBER = ?";
Map<String, Object> values = jdbcTemplate.queryForMap(sql,confirmation.getConfirmationNumber());

2,2)queryForList (): Я использую его, если ожидаю больше строк в качестве результата моего запроса. Так что я получусписок объектов карты где каждый объект Map представляет конкретную строку вывода запроса. Как то так:

String sql = “select * from PERSON”;
return jdbcTemplate.queryForList(sql);

Я думаю, что это тоже довольно ясно.

Тогда я могу отобразитьResultSet вдоменный объект используя JdbcTemplate, и это не так ясно для меня.

При чтении документации сообщается, что JdbcTemplate поддерживает это с помощьюобратный вызов, Что именно это означаетобратный вызов ?

Я знаю, что Spring предоставляетИнтерфейс RowMapper засопоставление одной строки ResultSet с объектом:

public interface RowMapper<T> {
    T mapRow(ResultSet rs, int rowNum)
    throws SQLException;
}

и у меня есть следующий пример compoese этим методом, который использует новый объект RestaurandRowMapper в качестве возвращаемого объектаqueryForObject () метод:

public Restaurant findByMerchantNumber(String merchantNumber) {
    String sql = "select MERCHANT_NUMBER, NAME, BENEFIT_PERCENTAGE, BENEFIT_AVAILABILITY_POLICY from T_RESTAURANT where MERCHANT_NUMBER = ?";

    return jdbcTemplate.queryForObject(sql, new RestaurantRowMapper(), merchantNumber);

и этовнутренний класс:

class RestaurantRowMapper implements RowMapper<Restaurant> {
    public Restaurant mapRow(ResultSet rs, int i) throws SQLException {
        return mapRestaurant(rs);
    }
}

которые используют этот закрытый метод для создания отображения:

private Restaurant mapRestaurant(ResultSet rs) throws SQLException {
    // get the row column data
    String name = rs.getString("NAME");
    String number = rs.getString("MERCHANT_NUMBER");
    Percentage benefitPercentage = Percentage.valueOf(rs.getString("BENEFIT_PERCENTAGE"));
    // map to the object
    Restaurant restaurant = new Restaurant(number, name);
    restaurant.setBenefitPercentage(benefitPercentage);
    restaurant.setBenefitAvailabilityPolicy(mapBenefitAvailabilityPolicy(rs));
    return restaurant;
}

Поэтому у меня есть некоторые трудности, чтобы понять, как именно работают все эти вещи.

Мое главное сомнение заключается в следующем: я знаю, что с помощьюqueryForObject () метод, который я передаю ему в качестве входного параметра, тип объекта, который я ожидаю в качестве выходного (например, Interger или Long).

Если я ожидаю получить объект домена, который представляет собой всю строку таблицы (например, строкуСтолик в ресторане сопоставлены вRestaurand объект) Я думаю, что я должен использовать этот объект (как объект Restaurant), но в предыдущем примере я использую объект ** row mapper вместодоменный объект:

return jdbcTemplate.queryForObject(sql, new RestaurantRowMapper(), merchantNumber);

Этот внутренний класс содержит толькоmapRow () метод, который возвращает ожидаемыйдоменный объект

class RestaurantRowMapper implements RowMapper<Restaurant> {
    public Restaurant mapRow(ResultSet rs, int i) throws SQLException {
        return mapRestaurant(rs);
    }
}

Поэтому я думаю, что Spring автоматически вызываетmapRow () метод, который возвращаетРесторан и доменный объект это автоматически заменяется на метод queryForObject () или что-то вроде этого. Но я не уверен, что именно в этом сработает.

Что мне не хватает? Можете ли вы объяснить мне, что именно происходит за кулисами?

Tnx

Ответы на вопрос(2)

Ваш ответ на вопрос