springboot 启动时初始化数据库的步骤
问题描述
在spring-boot启动时,希望能执行相应的sql文件来初始化数据库。
使用配置文件初始化数据库
可以在spring-boot的配置文件application.yml中设置要初始化的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 publicDataSourceInitializerdataSourceInitializer(finalDataSourcedataSource){ ResourceDatabasePopulatorresourceDatabasePopulator=newResourceDatabasePopulator(); resourceDatabasePopulator.addScript(newClassPathResource("/data.sql")); DataSourceInitializerdataSourceInitializer=newDataSourceInitializer(); dataSourceInitializer.setDataSource(dataSource); dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); returndataSourceInitializer; }
在此基础上,我们可以自定义注解,通过获取注解上的sql文件路径,来达到通过注解初始化数据库目的,这样更方便简洁。
首先定义注解InitDataSource:
/** *用于补充:Hibernate无法自动创建视图的缺陷。 *系统启动时(hibernate根据entity创建完基本的数据表后),开始执行本注解下的sql文件中的SQL语言。 *使用方法: *@InitDataSource("sql文件路径(相对于resources路径下)")----注解到对应的类上 *比如:@InitDataSource("db/view/createView.sql)") *使用示例请参见:ResourceApplication.java *预了解详细的实现过程请参考:WebConfig.java的dataSourceInitializer方法 *@authorhuangtingxiang */ @Target({ElementType.TYPE})//该注解用于类上 @Retention(RetentionPolicy.RUNTIME)//在运行时起作用 @Component public@interfaceInitDataSource{ String\[\]value(); }
然后通过ClassPathScanningCandidateComponentProvider这个类来扫描spring组件上InitDataSource注解的值,将值取出,添加到DataSourceInitializer的初始化脚本中:
@Bean publicDataSourceInitializerdataSourceInitializer(finalDataSourcedataSource){ ResourceDatabasePopulatorresourceDatabasePopulator=newResourceDatabasePopulator(); //扫描com.mengyunzhi.measurement包找到InitDataSource注解的类(注解需使用到实现类上) ClassPathScanningCandidateComponentProviderprovider =newClassPathScanningCandidateComponentProvider(false); provider.addIncludeFilter(newAnnotationTypeFilter(InitDataSource.class));//添加包含的过滤信息 for(BeanDefinitionbeanDef:provider.findCandidateComponents("com.mengyunzhi.measurement")){ Class>cl=null; try{ cl=Class.forName(beanDef.getBeanClassName()); InitDataSourceinitDataSource=cl.getAnnotation(InitDataSource.class); String\[\]sqlFiles=initDataSource.value(); for(Stringsql:sqlFiles){ //如果sql文件存在加入数据库初始化中否则抛出异常终止执行 ClassPathResourceresource=newClassPathResource("/"+sql); if(resource.exists()){ resourceDatabasePopulator.addScript(resource); }else{ thrownewDataSourceInitializerException("未找到资源文件:"+sql,cl); } } }catch(ClassNotFoundExceptione){ e.printStackTrace(); } } DataSourceInitializerdataSourceInitializer=newDataSourceInitializer(); dataSourceInitializer.setDataSource(dataSource); dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); returndataSourceInitializer; }
这样一来,只需要在spring-boot类上使用@InitDataSource({"data.sql"})注解,就可以自动进行数据库的初始化操作了。
以上就是springboot启动时初始化数据库的步骤的详细内容,更多关于springboot初始化数据库的资料请关注毛票票其它相关文章!