¿Cómo funciona exactamente la interfaz Spring RowMapper?

Estoy estudiando para la certificación Spring Core y tengo algunas dudas sobre cómo Spring maneja las consultas JDBC:

Por lo tanto, sé que puedo obtener datos de mis tablas de base de datos de varias maneras, según el tipo de datos que espero obtener:

1) Consulta paratipo simple (como int, long o String): uso elqueryForObject () método de lajdbcTemplate clase, algo así:

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

Entonces, para obtener un objeto simple como un valor int, uso elqueryForObject () método que le pasa eldeclaración sql y el tipo de objeto que espero recibir en la salida del método.

Ok, esto es bastante simple y creo que está bien.

2) Consulta para unfila de la mesa entera puesto en unMapa objeto: así que si no necesito un solo valor (que podría estar en una sola columna de una fila específica de una tabla o algo así como el ejemplo anterior) puedo usar elqueryForMap (..) y elqueryForList () métodos, de esta manera:

2.1)queryForMap (): Lo uso si espero ununica fila puesto en unobjeto de mapa único donde el valor de cada columna se asigna a uno de mi Mapa, algo así como:

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

2.2)queryForList (): Lo uso si espero más filas como resultado de mi consulta. Entonces obtendré unlista de objetos del mapa donde cada objeto Map representa una fila específica de la salida de la consulta. Algo así:

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

Creo que esto también está bastante claro.

Entonces puedo mapear unConjunto resultante en unaobjeto de dominio usando JdbcTemplate y esto no está tan claro para mí.

Al leer la documentación se le dice que JdbcTemplate lo respalda, eenfoque de devolución de llamada. ¿Qué es exactamente esto y yo?enfoque de devolución de llamada ?

Sé que Spring proporciona unInterfaz RowMapper paramapear una sola fila de un ResultSet a un objeto:

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

y tengo el siguiente ejemplo compuesto por este método que usa un nuevo objeto RestaurandRowMapper como objeto devuelto de unqueryForObject () método:

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);

y estoclase interna:

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

que usan este método privado para crear la asignación:

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;
}

Así que tengo algunas dificultades para entender cómo funcionan exactamente todas estas cosas.

Mi principal duda es la siguiente: Sé que usar elqueryForObject () método que le paso, como parámetro de entrada, el tipo de objeto que espero como salida (por ejemplo, un Interger o un Long).

Si espero obtener un objeto de dominio que represente una fila completa de una tabla (por ejemplo, una fila deMesa de restaurante mapeado en unRestaurando objeto) Estoy pensando que debería usar este objeto (como el objeto Restaurante) pero en el ejemplo anterior uso el objeto ** mapeador de filas en cambio elobjeto de dominio:

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

Esta clase interna contiene solo elmapRow () método que devuelve el esperadoobjeto de dominio

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

Así que creo que Spring llama automáticamente almapRow () método que devuelve elRestaurar objeto de dominio que se reemplaza automáticamente en el método queryForObject (), o algo así. Pero no estoy tan seguro de que funcione exactamente.

¿Qué me estoy perdiendo? ¿Puedes explicarme qué sucede exactamente en el backstage?

TNX

Respuestas a la pregunta(2)

Su respuesta a la pregunta