Статьи

Spring Boot и инициализация базы данных

Spring boot предлагает отличную среду, позволяющую разработчику сэкономить много времени и энергии при разработке весеннего приложения.

Одна из его замечательных функций — инициализация базы данных. Вы можете использовать весеннюю загрузку для инициализации базы данных sql. Начнем с файла Gradle

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
group 'com.gkatzioura'
version '1.0-SNAPSHOT'
 
apply plugin: 'java'
 
sourceCompatibility = 1.5
 
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
    }
}
 
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'spring-boot'
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web") {
        exclude module: "spring-boot-starter-tomcat"
    }
    compile("org.springframework.boot:spring-boot-starter-jetty")
    compile("org.springframework:spring-jdbc")
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("com.h2database:h2:1.4.191")
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Обратите особое внимание на зависимость org.springframework: spring-jdbc. На самом деле это зависимость, которая помогает с инициализацией базы данных. База данных H2 более чем достаточно для этого примера. Основной класс приложений

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package com.gkatzioura.bootdatabaseinitialization;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
 
/**
 * Created by gkatzioura on 29/4/2016.
 */
@SpringBootApplication
public class Application {
 
    public static void main(String[] args) {
 
        SpringApplication springApplication = new SpringApplication();
        ApplicationContext applicationContext = springApplication.run(Application.class,args);
    }
 
}

Следующим шагом является указание источника данных

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.gkatzioura.bootdatabaseinitialization.config;
 
import org.h2.jdbcx.JdbcDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
 
/**
 * Created by gkatzioura on 29/4/2016.
 */
@Configuration
public class DataSourceConfig {
 
    private static final String TEMP_DIRECTORY = System.getProperty("java.io.tmpdir");
 
    @Bean(name = "mainDataSource")
    public DataSource createMainDataSource() {
 
        JdbcDataSource ds = new JdbcDataSource();
        ds.setURL("jdbc:h2:"+TEMP_DIRECTORY+"/testdata;MODE=MySQL");
        return ds;
    }
 
}

Мы добавим файл schema.sql в папку ресурсов, чтобы он загружался в classpath. Файл schema.sql будет содержать все определения таблиц, необходимые для нашей базы данных.

1
2
3
4
5
CREATE TABLE IF NOT EXISTS `Users` (
    `user_id` bigint(20) NOT NULL AUTO_INCREMENT,
    `name` varchar(200) NOT NULL,
    PRIMARY KEY (`user_id`)
);

Следующий файл для добавления — data.sql в папке ресурсов. Этот файл будет содержать SQL-операторы, необходимые для заполнения нашей базы данных.

1
2
INSERT INTO `Users` (`user_id`,`name`) VALUES (null,'nick');
INSERT INTO `Users` (`user_id`,`name`) VALUES (null,'george');

При инициализации весенняя загрузка выполнит поиск файлов data.sql и schema.sql и выполнит их с инициализатором базы данных.

Пока все хорошо, однако, когда вы определили два источника данных, все усложняется. Мы добавим вторичный источник данных

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.gkatzioura.bootdatabaseinitialization.config;
 
import org.h2.jdbcx.JdbcDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
 
/**
 * Created by gkatzioura on 29/4/2016.
 */
@Configuration
public class DataSourceConfig {
 
    private static final String TEMP_DIRECTORY = System.getProperty("java.io.tmpdir");
 
    @Bean(name = "mainDataSource")
    public DataSource createMainDataSource() {
 
        JdbcDataSource ds = new JdbcDataSource();
        ds.setURL("jdbc:h2:"+TEMP_DIRECTORY+"/testdata;MODE=MySQL");
        return ds;
    }
 
    @Bean(name = "secondaryDataSource")
    public DataSource createSecondaryDataSource() {
 
        JdbcDataSource ds = new JdbcDataSource();
        ds.setURL("jdbc:h2:"+TEMP_DIRECTORY+"/secondarydata;MODE=MySQL");
        return ds;
    }
}

При запуске приложения мы получаем ошибку

1
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: mainDataSource,secondaryDataSource

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

1
2
3
4
5
6
7
8
@Bean(name = "mainDataSource")
    @Primary
    public DataSource createMainDataSource() {
 
        JdbcDataSource ds = new JdbcDataSource();
        ds.setURL("jdbc:h2:"+TEMP_DIRECTORY+"/testdata;MODE=MySQL");
        return ds;
    }

При этом инициализатор будет запускать сценарии schema.sql и data.sql, используя компонент mainDataSource. Еще одна замечательная особенность весенней загрузки базы данных — инициализация в том, что она может быть интегрирована с flyway . Получите больше информации о пролетном пути здесь .

Вы можете найти исходный код проекта здесь

Ссылка: Spring Boot и инициализация базы данных от нашего партнера JCG Эммануила Gkatziouras в блоге gkatzioura .