欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫(kù)的步驟

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

問(wèn)題描述

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

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

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

首先設(shè)置spring.datasource.initialization-mode=always表示任何類型數(shù)據(jù)庫(kù)都進(jìn)行數(shù)據(jù)庫(kù)初始化,默認(rèn)情況下,spring-boot會(huì)自動(dòng)加載data.sql或data-${platform}.sql文件來(lái)初始化數(shù)據(jù)庫(kù)??梢酝ㄟ^(guò)設(shè)置不同的數(shù)據(jù)庫(kù)平臺(tái)來(lái)改變啟動(dòng)的腳本名稱。

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

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

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

如果通過(guò)配置文件不能滿足需求,可以通過(guò)代碼來(lái)初始化數(shù)據(jù)庫(kù)。
只需要提供DataSourceInitializer這個(gè)bean,spring-boot啟動(dòng)時(shí)就會(huì)根據(jù)DataSourceInitializer來(lái)初始化數(shù)據(jù)庫(kù)了。

@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ǔ)上,我們可以自定義注解,通過(guò)獲取注解上的sql文件路徑,來(lái)達(dá)到通過(guò)注解初始化數(shù)據(jù)庫(kù)目的,這樣更方便簡(jiǎn)潔。
首先定義注解InitDataSource:

/** 
 * 用于補(bǔ)充:Hibernate無(wú)法自動(dòng)創(chuàng)建視圖的缺陷。 
 * 系統(tǒng)啟動(dòng)時(shí)(hibernate根據(jù)entity創(chuàng)建完基本的數(shù)據(jù)表后),開(kāi)始執(zhí)行本注解下的sql文件中的SQL語(yǔ)言。 
 * 使用方法: 
 * @InitDataSource("sql文件路徑(相對(duì)于resources路徑下)") ---- 注解到對(duì)應(yīng)的類上 
 * 比如:@InitDataSource("db/view/createView.sql)") 
 * 使用示例請(qǐng)參見(jiàn):ResourceApplication.java 
 * 預(yù)了解詳細(xì)的實(shí)現(xiàn)過(guò)程請(qǐng)參考:WebConfig.java 的 dataSourceInitializer方法 
 * @author huangtingxiang 
 */
@Target({ElementType.TYPE})   // 該注解用于類上 
@Retention(RetentionPolicy.RUNTIME) // 在運(yùn)行時(shí)起作用 
@Component 
public @interface InitDataSource { 
  String\[\] value(); 
}

然后通過(guò)ClassPathScanningCandidateComponentProvider這個(gè)類來(lái)掃描spring組件上InitDataSource注解的值,將值取出,添加到DataSourceInitializer的初始化腳本中:

@Bean 
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { 
  ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); 
  // 掃描com.mengyunzhi.measurement 包 找到InitDataSource注解的類(注解需使用到實(shí)現(xiàn)類上) 
 ClassPathScanningCandidateComponentProvider provider 
      = new ClassPathScanningCandidateComponentProvider(false); 
  provider.addIncludeFilter(new AnnotationTypeFilter(InitDataSource.class)); //添加包含的過(guò)濾信息 
 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ù)庫(kù)初始化中 否則拋出異常終止執(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; 
}

這樣一來(lái),只需要在spring-boot類上使用@InitDataSource({"data.sql"})注解,就可以自動(dòng)進(jìn)行數(shù)據(jù)庫(kù)的初始化操作了。

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

相關(guān)文章

  • SpringMVC中DispatcherServlet的HandlerMapping詳解

    SpringMVC中DispatcherServlet的HandlerMapping詳解

    這篇文章主要介紹了SpringMVC中DispatcherServlet的HandlerMapping詳解,上回說(shuō)的Handler,我們說(shuō)是處理特定請(qǐng)求的,也就是說(shuō),不是所有的請(qǐng)求都能處理,那么問(wèn)題來(lái)了,我們?cè)踔滥膫€(gè)請(qǐng)求是由哪個(gè)Handler處理的呢,需要的朋友可以參考下
    2023-10-10
  • Resty開(kāi)發(fā)restful版本的Jfinal深入研究

    Resty開(kāi)發(fā)restful版本的Jfinal深入研究

    這篇文章主要為大家介紹了Resty開(kāi)發(fā)restful版本的Jfinal深入研究有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java快速排序的實(shí)現(xiàn)方法示例

    Java快速排序的實(shí)現(xiàn)方法示例

    快速排序是對(duì)冒泡排序的一種改進(jìn),下面這篇文章主要給大家介紹了關(guān)于Java快速排序的實(shí)現(xiàn)方法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-03-03
  • java并發(fā)鎖的實(shí)現(xiàn)

    java并發(fā)鎖的實(shí)現(xiàn)

    Java中的鎖主要是為了解決多個(gè)線程訪問(wèn)共享數(shù)據(jù)時(shí)的競(jìng)爭(zhēng)問(wèn)題,確保線程能夠安全地訪問(wèn)和修改共享數(shù)據(jù),本文主要介紹了java并發(fā)鎖的實(shí)現(xiàn),感興趣的可以了解一下
    2024-04-04
  • Maven如何修改打包文件名稱

    Maven如何修改打包文件名稱

    這篇文章主要介紹了Maven如何修改打包文件名稱問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • mybatis test標(biāo)簽如何判斷值是否相等

    mybatis test標(biāo)簽如何判斷值是否相等

    這篇文章主要介紹了mybatis test標(biāo)簽判斷值是否相等的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)通訊錄

    java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)通訊錄

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼

    Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼

    本篇文章主要介紹了Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • SpringBoot前后端json數(shù)據(jù)交互的全過(guò)程記錄

    SpringBoot前后端json數(shù)據(jù)交互的全過(guò)程記錄

    現(xiàn)在大多數(shù)互聯(lián)網(wǎng)項(xiàng)目都是采用前后端分離的方式開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端json數(shù)據(jù)交互的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • jpanel設(shè)置背景圖片的二個(gè)小例子

    jpanel設(shè)置背景圖片的二個(gè)小例子

    這篇文章主要介紹了jpanel設(shè)置背景圖片的二個(gè)小例子,實(shí)現(xiàn)了動(dòng)態(tài)加載圖片做背景的方法,需要的朋友可以參考下
    2014-03-03

最新評(píng)論