Статьи

Spring 3 упрощает использование встроенных баз данных

Одной из новых функций, представленных в Spring 3, является поддержка встроенных механизмов баз данных Java. Встроенные базы данных, такие как HSQL, H2 или Derby, очень полезны на этапе разработки проекта, потому что они быстрые, занимают мало места в памяти, улучшают тестируемость и имеют открытый исходный код. Использование таких баз данных в вашей среде разработки устраняет бремя более крупных и объемных баз данных, таких как Oracle. Если вы используете любую версию Spring до версии 3, вы настроите источник данных баз данных HSQL, как показано ниже

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"><property name="driverClassName" value="org.hsqldb.jdbcDriver" /><property name="url" value="jdbc\:hsqldb\:mem\:spring-playground" /><property name="username" value="sa" /><property name="password" value="" /></bean>

и вы ссылаетесь на этот компонент источника данных в вашем компоненте entityManagerFactory, как показано ниже

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"><property name="dataSource" ref="dataSource" /></bean>

Чтобы сконфигурировать встроенную базу данных, мы должны помнить имя класса драйвера, URL, имя пользователя или пароль. Хорошо, если вы посмотрите на большинство этих настраиваемых параметров, каждый из них должен быть скорее соглашением, чем конфигурацией. Используя Spring 3, вы можете избавиться от всей этой боли, просто используя тег jdbc: embedded-database в пространстве имен spring-jdbc

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"><jdbc:embedded-database id="embeddedDatasource" type="HSQL"/></beans>

Одна строка конфигурации xml, показанная выше, создает экземпляр встроенной базы данных HSQL. Экземпляр базы данных становится доступным для контейнера Spring как компонент типа javax.sql.DataSource. Этот bean-компонент может затем вводиться в объекты доступа к данным по мере необходимости. Spring изначально поддерживает HSQL, H2 и Derby, где HSQL — ядро ​​базы данных по умолчанию, если вы не указали тип. Показанная выше конфигурация полезна, когда вы работаете с JPA и когда вы хотите создать пустую базу данных и автоматически сгенерировать схему базы данных, т. Е. Используя свойство hibernate.hbm2ddl.auto.

Используя тег jdbc: embedded-database, вы можете не только создать пустую базу данных, но и создать схему и вставить в нее данные. Например,

<jdbc:embedded-database id="embeddedDataSource"><jdbc:script location="classpath:schema.sql"/><jdbc:script location="classpath:data.sql"/></jdbc:embedded-database>

Приведенная выше конфигурация не только создаст экземпляр встроенного экземпляра базы данных HSQL, но также создаст схему и вставит в нее данные. Файлы SQL, указанные в теге jdbc: script, должны существовать в пути к классам, в противном случае вы получите исключение FileNotFoundException.

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

Вы можете не только создать встроенный экземпляр базы данных, используя xml, но и создать его программно, используя свободный интерфейс класса EmbeddedDatabaseBuilder. Это полезно в тех случаях, когда вам нужно протестировать ваше приложение в автономной среде без полноценного контекста приложения Spring. Рекомендуется, чтобы ваш юнит-тест не зависел от Spring. Предположим, что вы хотите выполнить юнит-тест метода UserDao findUserByUsername и хотите протестировать его для встроенной базы данных. Для этого вы напишите такой тестовый код

public class UserDaoTest {    private EmbeddedDatabase database;    @Before    public void setUp() throws Exception {        database = new EmbeddedDatabaseBuilder().addDefaultScripts().build();        assertThat(database, is(notNullValue()));    }    @After    public void tearDown() throws Exception {        database.shutdown();    }    @Test    public void shouldFindUserByUsername() {        UserDao dao = new UserDao();        JdbcTemplate jdbcTemplate = new JdbcTemplate(database);        dao.setJdbcTemplate(jdbcTemplate);        User user = dao.findUserByUsername("shekhar");        assertThat(user, is(notNullValue()));    }}

Приведенный выше код создаст экземпляр встроенной базы данных HSQL и выполнит сценарии по умолчанию для заполнения базы данных. Сценарии по умолчанию называются schema.sql, который создает схему базы данных, и data.sql, который вставляет данные в базу данных.

В следующий раз, когда вы используете встроенную базу данных, помните о поддержке встроенной базы данных Spring 3.