Запросы как объекты.

Логическое развитие идеи параметризованых запросов и prepared запросов, это инкапсуляция запросов в собственные классы. Каждый запрос обёртывается в класс, объекты которого каким-либо образом настраиваются во время исполнения и выполняют себя сами.

В этом примере используется схема данных из статьи запросы в Spring JDBC.

MappingSqlQuery

Класс MappingSqlQuery  ориентирован на выполнение запросов, возвращающих данные и объединяет в себе функционал RowMapper и PreparedStatementCreator: сразу и параметры связывает сам, и результат в объект отображает сам.

Реализация собственного MappingSqlQuery обычно состоит из двух частей. Вначале реализуют код, настраивающий MappingSqlQuery, то есть задают сам запрос, указывают какие у него параметры и т.д. Эту часть я вынес в конструктор.

Вторая часть — один в один реализация RowMapper, которая должна из JDBC ResultSet построить требуемый объект. Из-за того, что для настройки MappingSqlQuery  требуется объект класса DataSource, его инициализация выполняется в методе @PostConstruct. Альтернативой этому было бы описание OrderMappingQuery как bean и тогда сам бы его создал, сам сконфигурировал с DataSource  и сам подсунул бы в места использования.

SqlUpdate

Антонимом к MappingSqlQuery является SqlUpdate: всё то же самое, только не для получения данных, а для изменения данных.

В собственной реализации точно так же требуется вначале настроить объект, задав запрос, параметры соединение и прочая. Но, так как предполагается, что запрос ничего не возвращает, реализация кода отображения результатов в объект не требуется. По той же причине, из-за необходимости передавать DataSource, я и в этот раз инициализирую объект UpdateSkuDescriptionQuery  в @PostConstruct методе.

SimpleJdbcInsert

Поскольку из базы можно получить её метаинформацию,  в частности названия и типы столбцов в таблицах, то в некоторых случаях можно даже и сам текст запроса то и не писать, только операцию и параметры. SimpleJdbcInsert  это как раз тот случай: настраиваем один раз таблицу и прочие параметры и сразу можно добавлять строки.

SimpleJdbcInsert принимает SqlParameterSource, что позволяет передавать в него параметры как в обычный запрос, используя Map или любую реализацию SqlParameterSource.

Код примера доступен на github.