Как получить id нового объекта в Spring JDBC.

key-to-identity-theftВ статье о выполнении запросов с помощью Spring JDBC я нарушил одно из правил написания модульных тестов: тест метода создающего нового заказчика ничего не проверял:

А не проверял этот тест ничего потому, что не было возможности сделать запрос к базе, который бы вернул свежесозданную запись. В CustomerRepository нет метода, который возвращает запись по её e-mail, а какой у новой записи id мы не знаем.

Но id можно узнать 🙂 Метод update() позволяет передать ему callback интерфейс KeyHolder, в котором, после выполнения запроса, будет храниться сгенерированный id строки.

К сожалению, из-за различающихся реализаций JDBC драйверов баз данных для использования update() и KeyHolder приходится спускаться на более низкий уровень и вручную создавать PreparedStatement используя интерфейс PreparedStatementCreator. Это приводит к некоторой многословности кода.

Тест к этой реализации может теперь проверить, действительно ли в базе данных появляется созданный объект:

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