Spring JDBC и embedded databases

connection-mode-embedded-2В есть улучшенная поддержка встраиваемых баз данных,  подходящая для тех случаев, когда база данных нужна только на время работы приложения и её содержимым можно пренебречь. Spring JDBC может сам создавать такие базы и наполнять их содержимым.

Подготовка

За основу я взял код из статьи Hello, Spring JDBC и добавил в него артефакты встраиваемых баз данных:

Кроме того, в каталог src/main/resources/ я добавил несколько скриптов:

Создание баз данных

Создание встраиваемой базы данных сводится к паре строк в файле описания контекста:

Базе данных присваивается id и Spring’у сообщается, какую именно базу данных мы хотим использовать. Поддерживаются H2, HSQLDB, и Apache Derby. При описании базы можно дополнительно перечислить файлы SQL скриптов, которые будут выполнены в порядке перечисления. Скрипты выполняются при создании базы (по умолчанию) или при удалении (если указан аттрибут «execution=DESTROY»).

Использование скриптов для создания структуры базы данных и наполнения её данными делает жизнь гораздо приятнее — писать скрипты с sql запросами проще, чем писать те же самые запросы в коде приложения и самому заниматься инициализацией базы.

Создавать встраиваемые базы можно и с использованием Java config:

Как видите, параметры и возможности в обоих случаях те же самые. Разумеется EmbeddedDataBaseBuilder можно использовать в любой удобный момент, а не только для создания Spring beans.

Тесты

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

Используя отдельный контекст и отдельный SQL скрипт я наполняю базу тестовыми данными, которые ожидает мой тест.

Использование

Использование очевидно — data source оборачивается в JdbcTemplate и используется как обычно. Так как базы данных у меня три, то и JdbcTemplate тоже будет три:

Полученный результат обрабатывается и выводится:

Поскольку queryForList() возвращает не ResultSet  а обычный список, то можно использовать и Stream API, в отличие от сырого JDBC.

Бонус

Использование анализатора кода checkstyle и Spring Java config сопряжено с некоторыми неудобствами. Checkstyle настаивает, чтобы все методы в классе ContextConfiguration были final, в то время как Spring желает обратного. Чтобы сделать проект собирающимся, я добавил этот класс в исключения. Для этого в корне проекта я завёл файл checkstyle-suppressions.xml в котором перечислил, что надо игнорировать:

Этот же файл я добавил к конфигурации maven плагина:

 

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