springboot 啟動時初始化數(shù)據(jù)庫的步驟
問題描述
在spring-boot啟動時,希望能執(zhí)行相應的sql文件來初始化數(shù)據(jù)庫。
使用配置文件初始化數(shù)據(jù)庫
可以在spring-boot的配置文件application.yml中設置要初始化的sql文件。這是最簡單的方法,只需要添加屬性就可以實現(xiàn)。
首先設置spring.datasource.initialization-mode=always表示任何類型數(shù)據(jù)庫都進行數(shù)據(jù)庫初始化,默認情況下,spring-boot會自動加載data.sql或data-${platform}.sql文件來初始化數(shù)據(jù)庫??梢酝ㄟ^設置不同的數(shù)據(jù)庫平臺來改變啟動的腳本名稱。
例如設置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; }
在此基礎上,我們可以自定義注解,通過獲取注解上的sql文件路徑,來達到通過注解初始化數(shù)據(jù)庫目的,這樣更方便簡潔。
首先定義注解InitDataSource:
/** * 用于補充:Hibernate無法自動創(chuàng)建視圖的缺陷。 * 系統(tǒng)啟動時(hibernate根據(jù)entity創(chuàng)建完基本的數(shù)據(jù)表后),開始執(zhí)行本注解下的sql文件中的SQL語言。 * 使用方法: * @InitDataSource("sql文件路徑(相對于resources路徑下)") ---- 注解到對應的類上 * 比如:@InitDataSource("db/view/createView.sql)") * 使用示例請參見:ResourceApplication.java * 預了解詳細的實現(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)容,更多關于springboot 初始化數(shù)據(jù)庫的資料請關注腳本之家其它相關文章!
相關文章
SpringMVC中DispatcherServlet的HandlerMapping詳解
這篇文章主要介紹了SpringMVC中DispatcherServlet的HandlerMapping詳解,上回說的Handler,我們說是處理特定請求的,也就是說,不是所有的請求都能處理,那么問題來了,我們怎知道哪個請求是由哪個Handler處理的呢,需要的朋友可以參考下2023-10-10Resty開發(fā)restful版本的Jfinal深入研究
這篇文章主要為大家介紹了Resty開發(fā)restful版本的Jfinal深入研究有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03Java使用NIO包實現(xiàn)Socket通信的實例代碼
本篇文章主要介紹了Java使用NIO包實現(xiàn)Socket通信的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02SpringBoot前后端json數(shù)據(jù)交互的全過程記錄
現(xiàn)在大多數(shù)互聯(lián)網(wǎng)項目都是采用前后端分離的方式開發(fā),下面這篇文章主要給大家介紹了關于SpringBoot前后端json數(shù)據(jù)交互的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-03-03