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.5buildscript { 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. */@SpringBootApplicationpublic 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. */@Configurationpublic 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. */@Configurationpublic 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 . |