Spring Boot是一个很好的框架,可在开发Spring应用程序时为开发人员节省大量时间和精力。
它的主要功能之一是数据库初始化。 您可以使用spring boot来初始化您的sql数据库。 我们将从gradle文件开始
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数据库已绰绰有余。 应用程序主类
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);}}
下一步是指定数据源
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文件将包含数据库所需的所有表定义。
CREATE TABLE IF NOT EXISTS `Users` (`user_id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(200) NOT NULL,PRIMARY KEY (`user_id`)
);
下一个要添加的文件是resources文件夹上的data.sql。 该文件将包含填充数据库所需的sql语句。
INSERT INTO `Users` (`user_id`,`name`) VALUES (null,'nick');
INSERT INTO `Users` (`user_id`,`name`) VALUES (null,'george');
在初始化时,spring boot将搜索data.sql和schema.sql文件,并使用数据库初始化程序执行它们。
到目前为止,还不错,但是,当您定义了两个数据源时,事情就变得复杂了。 我们将添加辅助数据源
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;}
}
通过启动应用程序,我们得到一个错误
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
问题在于数据源初始化程序注入了数据源。 因此,我们必须指定数据源注入,否则将获得异常。 一种解决方法是指定哪个数据源bean是主要的。
@Bean(name = "mainDataSource")@Primarypublic DataSource createMainDataSource() {JdbcDataSource ds = new JdbcDataSource();ds.setURL("jdbc:h2:"+TEMP_DIRECTORY+"/testdata;MODE=MySQL");return ds;}
这样,初始化程序将使用mainDataSource bean运行schema.sql和data.sql脚本。 Spring Boot数据库的另一个重要功能是初始化,它可以与flyway集成。 在此处获取有关飞行路线的更多信息。
您可以在这里找到项目源代码
翻译自: https://www.javacodegeeks.com/2016/05/spring-boot-database-initialization.html