viernes, 28 de febrero de 2020

Spring JDBC Template

Por una migración y actualización de una aplicación que tengo que hacer me he encontrado con la necesidad de tener que ejecutar consultas nativas en SQL, he pensado en integrarlo con JPA pero resulta mucho trabajo como para hacer solo algunas consultas, por lo que encontré una extensión más que provee SpringBoot para hacerlo de forma más fácil.

La configuración del jdbcTemplate es la siguiente:


@Bean(name = namedParameterJdbcTemplate")
public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("dataSource") 
                                                             DataSource dataSource) {

   return new NamedParameterJdbcTemplate(dataSource);
}


Usar NamedParameterJdbcTemplate nos permite manejar parámetros con los nombres que quisieramos, mas adelante se mostrara en el siguiente ejemplo:

MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", name);


Así se definen los parámetros que se van a pasar a la query, utilizando nombres (:nombre) así se identifican de una mejor forma dentro de la propia query, en este caso la consulta a la base de datos es sencilla, sera muy útil cuando tengamos consultas grandes a la base de datos.

    List users = namedParameterJdbcTemplate.query(
                      "SELECT * FROM USERS WHERE NAME = :nombre ", params, new UserRowMapper());

Se puede ver que se ejecuta una consulta a la base directamente con SQL y luego utiliza un objeto mapper para hacer la transformación al objeto que quisiéramos.
public class UserRowMapper implements RowMapper {

  @Override
  public UserRow mapRow(ResultSet resultSet, int rowNum) throws SQLException {

    UserRow row = new UserRow ();

    row.setName(resultSet.getLong("NAME"));
    row.setLastName(resultSet.getLong("LAST_NAME"));
    row.setId(resultSet.getString("USER_ID"));

    return row;

  }
}

Así se define el mapper, haciendo las conversiones correspondientes y hasta con la posibilidad de personalizar las transformaciones que prefieramos.