springboot启动时初始化数据库的步骤
问题描述
在spring-boot启动时,希望能执⾏相应的sql⽂件来初始化数据库。
使⽤配置⽂件初始化数据库
可以在spring-boot的配置⽂件l中设置要初始化的sql⽂件。这是最简单的⽅法,只需要添加属性就可以实现。
⾸先设置spring.datasource.initialization-mode=always表⽰任何类型数据库都进⾏数据库初始化,默认情况下,spring-boot会⾃动加载data.sql或data-${platform}.sql⽂件来初始化数据库。可以通过设置不同的数据库平台来改变启动的脚本名称。
例如设置spring.datasource.platform=mysql,就会加载data-mysql.sql的数据库脚本。把数据库脚本⽂件放在resources路径下即可。
如果项⽬使⽤的是flyway管理数据库的话,可以直接在flyway路径下添加⼀个新版本的sql⽂件,flyway也会⾃动执⾏sql⽂件并记录版本信息。
通过代码初始化数据库
如果通过配置⽂件不能满⾜需求,可以通过代码来初始化数据库。
只需要提供DataSourceInitializer这个bean,spring-boot启动时就会根据DataSourceInitializer来初始化数据库了。
@Bean
安装mysql初始化数据库失败public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
在此基础上,我们可以⾃定义注解,通过获取注解上的sql⽂件路径,来达到通过注解初始化数据库⽬的,这样更⽅便简洁。⾸先定义注解InitDataSource:
/**
* ⽤于补充:Hibernate⽆法⾃动创建视图的缺陷。
* 系统启动时(hibernate根据entity创建完基本的数据表后),开始执⾏本注解下的sql⽂件中的SQL语⾔。
* 使⽤⽅法:
* @InitDataSource("sql⽂件路径(相对于resources路径下)") ---- 注解到对应的类上
* ⽐如:@InitDataSource("db/view/createView.sql)")
* 使⽤⽰例请参见:ResourceApplication.java
* 预了解详细的实现过程请参考:WebConfig.java 的 dataSourceInitializer⽅法
* @author huangtingxiang
*/
@Target({ElementType.TYPE}) // 该注解⽤于类上
@Retention(RetentionPolicy.RUNTIME) // 在运⾏时起作⽤
@Component
public @interface InitDataSource {
String\[\] value();
}
然后通过ClassPathScanningCandidateComponentProvider这个类来扫描spring组件上InitDataSource注解的值,将值取出,添加到DataSourceInitializer的初始化脚本中:
@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
// 扫描asurement 包到InitDataSource注解的类(注解需使⽤到实现类上)
ClassPathScanningCandidateComponentProvider provider
= new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AnnotationTypeFilter(InitDataSource.class)); //添加包含的过滤信息
for (BeanDefinition beanDef : provider.findCandidateComponents("asurement")) {
Class<?> cl = null;
try {
cl = Class.BeanClassName());
InitDataSource initDataSource = cl.getAnnotation(InitDataSource.class);
String\[\] sqlFiles = initDataSource.value();
for (String sql: sqlFiles) {
/
/ 如果sql⽂件存在加⼊数据库初始化中否则抛出异常终⽌执⾏
ClassPathResource resource = new ClassPathResource("/" + sql);
if (ists()) {
resourceDatabasePopulator.addScript(resource);
} else {
throw new DataSourceInitializerException("未到资源⽂件:" + sql, cl);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
这样⼀来,只需要在spring-boot类上使⽤@InitDataSource({"data.sql"})注解,就可以⾃动进⾏数据库的初始化操作了。
以上就是springboot 启动时初始化数据库的步骤的详细内容,更多关于springboot 初始化数据库的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论