springboot 启动时初始化数据库的步骤

网友投稿 1760 2023-02-25

springboot 启动时初始化数据库的步骤

springboot 启动时初始化数据库的步骤

问题描述

在spring-boot启动时,希望能执行相应的sql文件来初始化数据库。

使用配置文件初始化数据库

可以在spring-boot的配置文件application.yml中设置要http://初始化的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

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);

returnhttp:// dataSourceInitializer;

}

在此基础上,我们可以自定义注解,通过获取注解上的sql文件路径,来达到通过注解初始化数据库目的,这样更方便简洁。

首先定义注解InitDataSource:

/**

* 用于补充http://: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) // 在运行时起作用

@ComponenoGlWrIdrtt

public @interface InitDataSource {

String\[\] value();

}

然后通过ClassPathScanningCandidateComponentProvider这个类来扫描spring组件上InitDataSource注解的值,将值取出,添加到DataSourceInitializer的初始化脚本中:

@Bean

public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {

ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();

// 扫描com.mengyunzhi.measurement 包 找到InitDataSource注解的类(注解需使用到实现类上)

ClassPathScanningCandidateComponentProvider provider

= new ClassPathScanningCandidateComponentProvider(false);

provider.addIncludeFilter(new AnnotationTypeFilter(InitDataSource.class)); //添加包含的过滤信息

for (BeanDefinition beanDef : provider.findCandidateComponents("com.mengyunzhi.measurement")) {

Class> cl = null;

try {

cl = Class.forName(beanDef.getBeanClassName());

InitDataSource initDataSource = cl.getAnnotation(InitDataSource.class);

String\[\] sqlFiles = initDataSource.value();

for (String sql: sqlFiles) {

// 如果sql文件存在 加入数据库初始化中 否则抛出异常终止执行

ClassPathResource resource = new ClassPathResource("/" + sql);

if (resource.exists()) {

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 初始化数据库的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IntelliJ IDEA中Project与Module的概念以及区别
下一篇:vue能直接开发小程序码(用vue开发小程序)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~