springboot 啟動時初始化數(shù)據(jù)庫的步驟
問題描述
在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)文章
Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解
這篇文章主要介紹了Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解,有些朋友可能不了解過濾器、監(jiān)聽器和攔截器的區(qū)別,本文就來詳細講一下,相信看完你會有所收獲,需要的朋友可以參考下2024-01-01
SpringBoot通過JSON傳遞請求參數(shù)的實例詳解
這篇文章主要介紹了SpringBoot通過JSON傳遞請求參數(shù),示例介紹SpringMVC如何通過JSON格式傳遞入?yún)?,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11
Java 中的 @SneakyThrows 注解的使用方法(簡化異常處理的利與弊)
@SneakyThrows是Lombok提供的一個注解,用于簡化Java方法中的異常處理,特別是對于檢查型異常,它允許方法拋出異常而不必顯式聲明或捕獲這些異常,本文介紹Java 中的 @SneakyThrows 注解的使用方法,感興趣的朋友一起看看吧2025-03-03
java讀取文件內(nèi)容的三種方法代碼片斷分享(java文件操作)
本文介紹java讀取文件內(nèi)容的三種方法,代碼可以直接放到程序中使用,大家參考使用吧2014-01-01
java 運行報錯has been compiled by a more recent version of the J
java 運行報錯has been compiled by a more recent version of the Java Runtime (class file version 54.0)2021-04-04
zuulGateway 通過filter統(tǒng)一修改返回值的操作
這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Mybatis?Plus使用XML編寫動態(tài)sql的超簡易方法
這篇文章主要介紹了Mybatis?Plus使用XML編寫動態(tài)sql的超簡易方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

