La clase NamedParameterJdbcTemplate brinda soporte para programar instrucciones JDBC usando parámetros con nombre, en lugar de programar instrucciones JDBC usando solo argumentos de marcador de posición clásicos ( '?'). La clase NamedParameterJdbcTemplate envuelve un JdbcTemplate y delega la mayor parte de su trabajo al JdbcTemplate envuelto. Esta sección describe sólo aquellas áreas de funcionalidad de la clase NamedParameterJdbcTemplate que difieren del propio JdbcTemplate, es decir, la programación de instrucciones JDBC utilizando parámetros con nombre. El siguiente ejemplo muestra cómo utilizar NamedParameterJdbcTemplate:

Java
// alguna clase DAO con soporte JDBC...
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource) {
    this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(*) from T_ACTOR where first_name = :first_name";
    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}
Kotlin
private val namedParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
fun countOfActorsByFirstName(firstName: String): Int {
    val sql = "select count(*) from T_ACTOR where first_name = :first_name"
    val namedParameters = MapSqlParameterSource("first_name", firstName)
    return namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Int::class.java)!!
}

Tenga en cuenta el uso de la notación de parámetro con nombre en el valor asignado a la variable sql y el valor correspondiente que está conectado a la variable namedParameters (de tipo MapSqlParameterSource ).

También puede pasar parámetros con nombre y sus valores correspondientes a una instancia NamedParameterJdbcTemplate usando un estilo basado en Map. Los métodos restantes expuestos por NamedParameterJdbcOperations e implementados por la clase NamedParameterJdbcTemplate siguen un patrón similar y no se analizan aquí.

El siguiente ejemplo muestra el uso de un estilo basado en Map:

Java
// alguna clase DAO con soporte JDBC...
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource) {
    this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public int countOfActorsByFirstName(String firstName) {
    String sql = "select count(*) from T_ACTOR where first_name = :first_name";
    Map<String, String> namedParameters = Collections.singletonMap("first_name", firstName);
    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}
Kotlin
// alguna clase DAO con soporte JDBC...
private val namedParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
fun countOfActorsByFirstName(firstName: String): Int {
    val sql = "select count(*) from T_ACTOR where first_name = :first_name"
    val namedParameters = mapOf("first_name" to firstName)
    return namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Int::class.java)!!
}

Una de las características interesantes asociadas con NamedParameterJdbcTemplate (y existente en el mismo paquete Java) es la interfaz SqlParameterSource. Ya has visto una implementación de ejemplo de esta interfaz en uno de los fragmentos de código anteriores (la clase MapSqlParameterSource). SqlParameterSource es la fuente de valores de parámetros con nombre para NamedParameterJdbcTemplate. La clase MapSqlParameterSource es una implementación simple que es un adaptador para java.util.Map, donde las claves son los nombres de los parámetros y los valores son los valores de los parámetros.

Otra implementación de SqlParameterSource es la clase BeanPropertySqlParameterSource. Esta clase envuelve un JavaBean arbitrario (es decir, una instancia de una clase que sigue las convenciones de JavaBean) y utiliza las propiedades del JavaBean empaquetado como fuente de valores de parámetros con nombre.

El siguiente ejemplo muestra un JavaBean típico:

Java
public class Actor {
    private Long id;
    private String firstName;
    private String lastName;
    public String getFirstName() {
        return this.firstName;
    }
    public String getLastName() {
        return this.lastName;
    }
    public Long getId() {
        return this.id;
    }
    // configuradores omitidos...
}
Kotlin
clase de datos Actor(val id: Long, val firstName: String, val lastName: String)

El siguiente ejemplo utiliza NamedParameterJdbcTemplate para devolver el recuento de miembros de la clase que se muestra en el ejemplo anterior:

Java
// alguna clase DAO con soporte JDBC...
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource) {
    this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
public int countOfActors(Actor exampleActor) {
    // note that the named parameters correspond to the properties of the above-mentioned "Actor" class
    String sql = "select count(*) from T_ACTOR where first_name = :firstName and last_name = :lastName";
    SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);
    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}
Kotlin
// alguna clase DAO con soporte JDBC...
private val namedParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
private val namedParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
fun countOfActors(exampleActor: Actor): Int {
    // note that the named parameters correspond to the properties of the above-mentioned "Actor" class
    val sql = "select count(*) from T_ACTOR where first_name = :firstName and last_name = :lastName"
    val namedParameters = BeanPropertySqlParameterSource(exampleActor)
    return namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Int::class.java)!!
}

Recuerde que la clase NamedParameterJdbcTemplate envuelve la plantilla clásica JdbcTemplate. Si necesita acceso a una instancia del JdbcTemplate empaquetado para acceder a la funcionalidad que solo está presente en la clase JdbcTemplate, puede usar el getJdbcOperations() método para acceder al JdbcTemplate empaquetado a través de la interfaz JdbcOperations.

Ver también secciones "Mejores prácticas para trabajar con JdbcTemplate" para obtener orientación sobre el uso de la clase NamedParameterJdbcTemplate en el contexto de una aplicación.