Класс 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 в контексте приложения.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ