Клас NamedParameterJdbcTemplate
привносить підтримку програмування інструкцій JDBC з використанням
іменованих параметрів, на відміну від програмування інструкцій JDBC з використанням лише класичних
аргументів-плейсхолдерів ('?'
). Клас NamedParameterJdbcTemplate
обгортає JdbcTemplate
і делегує обгорнутому JdbcTemplate
більшу частину своєї роботи. У цьому розділі описані лише ті області
функціонування класу NamedParameterJdbcTemplate
, які відрізняються від самого JdbcTemplate
— а саме, програмування інструкцій JDBC з використанням іменованих параметрів. У цьому прикладі показано, як
використовувати NamedParameterJdbcTemplate
:
// певний клас 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);
}
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
:
// певний клас 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);
}
// певний клас 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:
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;
}
// сеттери опущені...
}
data class Actor(val id: Long, val firstName: String, val lastName: String)
У наступному прикладі використовується NamedParameterJdbcTemplate
для повернення лічильника членів
класу, показаного в попередньому прикладі:
// певний клас 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);
}
// певний клас 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 у контексті програми.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ