Клас NamedParameterJdbcTemplate привносить підтримку програмування інструкцій JDBC з використанням іменованих параметрів, на відміну від програмування інструкцій JDBC з використанням лише класичних аргументів-плейсхолдерів ('?'). Клас NamedParameterJdbcTemplate обгортає JdbcTemplate і делегує обгорнутому JdbcTemplate більшу частину своєї роботи. У цьому розділі описані лише ті області функціонування класу NamedParameterJdbcTemplate, які відрізняються від самого JdbcTemplate — а саме, програмування інструкцій JDBC з використанням іменованих параметрів. У цьому прикладі показано, як використовувати NamedParameterJdbcTemplate:

Java
// певний клас DAO з підтримкою 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)!!
}

Зверни увагу на використання нотації іменованого параметра у значенні, присвоєному змінній sql, та відповідному значенню, яке підключене до змінної namedParameters (типу MapSqlParameterSource ).

До того ж можна передати іменовані параметри та відповідні значення екземпляру NamedParameterJdbcTemplate, використовуючи стиль, заснований на Map. Інші методи, що відкриваються NamedParameterJdbcOperations і реалізуються класом NamedParameterJdbcTemplate, дотримуються аналогічної схеми і тут не розглядаються.

У цьому прикладі показано використання стилю, заснованого на Map:

Java
// певний клас DAO з підтримкою 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
// певний клас DAO з підтримкою 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)!!
}

Однією з приємних особливостей, пов'язаних з NamedParameterJdbcTemplate (і існуючих у тому ж пакеті Java), є інтерфейс SqlParameterSource. Ми вже розглядали приклад реалізації цього інтерфейсу в одному з попередніх фрагментів коду (клас MapSqlParameterSource). SqlParameterSource — це джерело значень іменованих параметрів для NamedParameterJdbcTemplate. Клас MapSqlParameterSource є простою реалізацією, яка є адаптером щодо java.util.Map, де ключами є імена параметрів, а значеннями — значення параметрів.

Іншою реалізацією SqlParameterSource є клас BeanPropertySqlParameterSource. Цей клас обертає довільний JavaBean (тобто екземпляр класу, який відповідає угодам JavaBean) і використовує властивості оберненого JavaBean як джерело значень іменованих параметрів.

У наступному прикладі показано типовий JavaBean:

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;
    }
    // сеттери опущені...
}
Kotlin
data class Actor(val id: Long, val firstName: String, val lastName: String)

У наступному прикладі використовується NamedParameterJdbcTemplate для повернення лічильника членів класу, показаного в попередньому прикладі:

Java
// певний клас DAO з підтримкою JDBC...
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void setDataSource(DataSource dataSource) {
    this.namedParameterJdbcTemplate = New NamedParameterJdbcTemplate(dataSource);
}
public int countOfActors(Actor exampleActor) {
    // Зверни увагу на відповідність іменованих параметрів властивостям вищезгаданого класу "Actor"
    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
// певний клас DAO з підтримкою JDBC...
private val namedParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
private val namedParameterJdbcTemplate = NamedParameterJdbcTemplate(dataSource)
fun countOfActors(exampleActor: Actor): Int {
    // Зверни увагу на відповідність іменованих параметрів властивостям вищезгаданого класу "Actor"
    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)!!
}

Пам'ятай, що клас NamedParameterJdbcTemplate огортає класичний шаблон JdbcTemplate. Якщо тобі потрібен доступ до екземпляра оберненого JdbcTemplate, щоб отримати доступ до функціональності, яка є тільки в класі JdbcTemplate, можна використовувати метод getJdbcOperations() для отримання доступу до оберненого JdbcTemplate через інтерфейс JdbcOperations.

Див. також розділи "Оптимальні методи роботи з JdbcTemplate", де наведено рекомендації щодо використання класу NamedParameterJdbcTemplate у контексті програми.