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

 更新时间:2021年01月06日 08:40:24   作者:鲸冬香  
这篇文章主要介绍了springboot 启动时初始化数据库的步骤,帮助大家更好的理解和使用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
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(); 
  // 扫描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 初始化数据库的资料请关注脚本之家其它相关文章!

相关文章

  • springboot与mybatis整合实例详解(完美融合)

    springboot与mybatis整合实例详解(完美融合)

    大家都知道springboot搭建一个spring框架只需要秒秒钟。下面通过实例代码给大家介绍一下springboot与mybatis的完美融合,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Java Class.forName()用法和newInstance()方法原理解析

    Java Class.forName()用法和newInstance()方法原理解析

    这篇文章主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • IntelliJ IDEA2020.3详细安装教程

    IntelliJ IDEA2020.3详细安装教程

    这篇文章主要介绍了IntelliJ IDEA2020.3详细安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java内存之happens-before和重排序

    Java内存之happens-before和重排序

    在JMM(Java内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。下面小编来简单介绍一下
    2019-05-05
  • java Future 接口使用方法详解

    java Future 接口使用方法详解

    这篇文章主要介绍了java Future 接口使用方法详解,Future接口是Java线程Future模式的实现,可以来进行异步计算的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java中集合List、Set和Map的入门详细介绍

    Java中集合List、Set和Map的入门详细介绍

    Java集合主要分为三种类型:Set(集)、List(列表)和Map(映射),下面这篇文章主要给大家介绍了关于Java中集合List、Set和Map的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Java操作redis设置第二天凌晨过期的解决方案

    Java操作redis设置第二天凌晨过期的解决方案

    这篇文章主要介绍了Java操作redis设置第二天凌晨过期的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 史上最通俗理解的Java死锁代码演示

    史上最通俗理解的Java死锁代码演示

    这篇文章主要给大家介绍了关于Java死锁代码演示的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java WebService技术详解

    Java WebService技术详解

    本文详细讲解了Java WebService技术工作原理以及调用方式。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Java接入通义千问的简单方法示例

    Java接入通义千问的简单方法示例

    ​ 通义千问是阿里云开发的大语言模型(Large language Model )LLM,旨在提供广泛的知识和普适性,可以理解和回答各领域中的问题,这篇文章主要给大家介绍了关于Java接入通义千问的简单方法,需要的朋友可以参考下
    2024-02-02

最新评论