最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot 啟動時初始化數(shù)據(jù)庫的步驟

 更新時間:2021年01月06日 08:40:24   作者:鯨冬香  
這篇文章主要介紹了springboot 啟動時初始化數(shù)據(jù)庫的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

問題描述

在spring-boot啟動時,希望能執(zhí)行相應(yīng)的sql文件來初始化數(shù)據(jù)庫。

使用配置文件初始化數(shù)據(jù)庫

可以在spring-boot的配置文件application.yml中設(shè)置要初始化的sql文件。這是最簡單的方法,只需要添加屬性就可以實現(xiàn)。

首先設(shè)置spring.datasource.initialization-mode=always表示任何類型數(shù)據(jù)庫都進行數(shù)據(jù)庫初始化,默認情況下,spring-boot會自動加載data.sql或data-${platform}.sql文件來初始化數(shù)據(jù)庫。可以通過設(shè)置不同的數(shù)據(jù)庫平臺來改變啟動的腳本名稱。

例如設(shè)置spring.datasource.platform=mysql,就會加載data-mysql.sql的數(shù)據(jù)庫腳本。把數(shù)據(jù)庫腳本文件放在resources路徑下即可。

如果項目使用的是flyway管理數(shù)據(jù)庫的話,可以直接在flyway路徑下添加一個新版本的sql文件,flyway也會自動執(zhí)行sql文件并記錄版本信息。

通過代碼初始化數(shù)據(jù)庫

如果通過配置文件不能滿足需求,可以通過代碼來初始化數(shù)據(jù)庫。
只需要提供DataSourceInitializer這個bean,spring-boot啟動時就會根據(jù)DataSourceInitializer來初始化數(shù)據(jù)庫了。

@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;
}

在此基礎(chǔ)上,我們可以自定義注解,通過獲取注解上的sql文件路徑,來達到通過注解初始化數(shù)據(jù)庫目的,這樣更方便簡潔。
首先定義注解InitDataSource:

/** 
 * 用于補充:Hibernate無法自動創(chuàng)建視圖的缺陷。 
 * 系統(tǒng)啟動時(hibernate根據(jù)entity創(chuàng)建完基本的數(shù)據(jù)表后),開始執(zhí)行本注解下的sql文件中的SQL語言。 
 * 使用方法: 
 * @InitDataSource("sql文件路徑(相對于resources路徑下)") ---- 注解到對應(yīng)的類上 
 * 比如:@InitDataSource("db/view/createView.sql)") 
 * 使用示例請參見:ResourceApplication.java 
 * 預(yù)了解詳細的實現(xiàn)過程請參考: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注解的類(注解需使用到實現(xiàn)類上) 
 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文件存在 加入數(shù)據(jù)庫初始化中 否則拋出異常終止執(zhí)行 
 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"})注解,就可以自動進行數(shù)據(jù)庫的初始化操作了。

以上就是springboot 啟動時初始化數(shù)據(jù)庫的步驟的詳細內(nèi)容,更多關(guān)于springboot 初始化數(shù)據(jù)庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

桃园县| 沧州市| 凤翔县| 宣威市| 天台县| 荔浦县| 繁峙县| 盐边县| 和硕县| 图木舒克市| 台中市| 桐梓县| 桓仁| 宜都市| 海丰县| 灵寿县| 乐至县| 宁安市| 田阳县| 阿拉善左旗| 淳安县| 南陵县| 佛冈县| 岚皋县| 甘南县| 深圳市| 翁源县| 栾川县| 罗源县| 新干县| 南安市| 芜湖市| 平塘县| 苍南县| 喀喇沁旗| 南通市| 平罗县| 龙陵县| 南汇区| 扬州市| 湟源县|