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...
namedParameterJdbcTemplate privado nameParameterJdbcTemplate;
setDataSource público vacío (Fuente de datos fuente de datos) {
    this.namedParameterJdbcTemplate = nuevo NamedParameterJdbcTemplate(dataSource);
}
public int countOfActorsByFirstName(String nombre) {
    String sql = "seleccione recuento (*) de T_ACTOR donde nombre =: nombre";
    SqlParameterSource nameParameters = new MapSqlParameterSource("first_name", firstName);
    devuelve this.namedParameterJdbcTemplate.queryForObject(sql, nameParameters, Integer.class);
}
Kotlin
val privado nameParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
divertido countOfActorsByFirstName (primer nombre: cadena): Int {
    val sql = "seleccione recuento (*) de T_ACTOR donde nombre =: nombre"
    val nameParameters = MapSqlParameterSource("primer_nombre", primerNombre)
    ¡¡devuelve nameParameterJdbcTemplate.queryForObject(sql, nameParameters, 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 Mapa:

Java
// alguna clase DAO con soporte JDBC...
namedParameterJdbcTemplate privado nameParameterJdbcTemplate;
setDataSource público vacío (Fuente de datos fuente de datos) {
    this.namedParameterJdbcTemplate = nuevo NamedParameterJdbcTemplate(dataSource);
}
public int countOfActorsByFirstName(String nombre) {
    String sql = "seleccione recuento (*) de T_ACTOR donde nombre =: nombre";
    Mapa<Cadena, Cadena> nameParameters = Collections.singletonMap("first_name", firstName);
    devuelve this.namedParameterJdbcTemplate.queryForObject(sql, nameParameters, Integer.class);
}
Kotlin
// alguna clase DAO con soporte JDBC...
valor privado nameParameterJdbcTemplate = NamedParameterJdbcTemplate (fuente de datos)
divertido countOfActorsByFirstName (primer nombre: cadena): Int {
    val sql = "seleccione recuento (*) de T_ACTOR donde nombre =: nombre"
    val nameParameters = mapOf("primer_nombre" a nombre)
    ¡¡devuelve nameParameterJdbcTemplate.queryForObject(sql, nameParameters, 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
actor de clase pública {
    identificación larga privada;
    cadena privada nombre;
    cadena privada apellido;
    cadena pública getFirstName() {
        devolver this.firstName;
    }
    cadena pública getApellido() {
        devolver este.apellido;
    }
    público largo getId() {
        devolver este.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...
namedParameterJdbcTemplate privado nameParameterJdbcTemplate;
setDataSource público vacío (Fuente de datos fuente de datos) {
    this.namedParameterJdbcTemplate = nuevo NamedParameterJdbcTemplate(dataSource);
}
public int recuentoDeActores(Actor ejemploActor) {
    // tenga en cuenta que los parámetros nombrados corresponden a las propiedades de la clase "Actor" mencionada anteriormente
    String sql = "seleccione recuento (*) de T_ACTOR donde nombre =: nombre y apellido =: apellido";
    SqlParameterSource nameParameters = new BeanPropertySqlParameterSource(exampleActor);
    devuelve this.namedParameterJdbcTemplate.queryForObject(sql, nameParameters, Integer.class);
}
Kotlin
// alguna clase DAO con soporte JDBC...
valor privado nameParameterJdbcTemplate = NamedParameterJdbcTemplate (fuente de datos)
valor privado nameParameterJdbcTemplate = NamedParameterJdbcTemplate (fuente de datos)
divertido countOfActors (ejemploActor: Actor): Int {
    // tenga en cuenta que los parámetros nombrados corresponden a las propiedades de la clase "Actor" mencionada anteriormente
    val sql = "seleccione recuento (*) de T_ACTOR donde nombre =: nombre y apellido =: apellido"
    val nameParameters = BeanPropertySqlParameterSource (ejemploActor)
    ¡¡devuelve nameParameterJdbcTemplate.queryForObject(sql, nameParameters, 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.