Spring Boot中自動執行sql腳本的方法實例
說明:所有的代碼基於SpringBoot 2.0.3版本
背景
在應用程序啟動後,可以自動執行建庫、建表等SQL腳本.下文中以要自動化執行people.sql腳本為例說明,腳本在SpringBoot工程中的路徑為:classpath:people.sql,腳本的具體內容如下:
CREATE TABLE IF NOT EXISTS people( persion_id BIGINT NOT NULL AUTO_INCREMENT, first_name VARCHAR(20), last_name VARCHAR(20), PRIMARY KEY (persion_id) );
實現核心
在SpringBoot的架構中,DataSourceInitializer類可以實現自動執行腳本的功能。通過自定義DataSourceInitializer Bean就可以實現按照業務要求執行特定的腳本。
實現方法
- 前提
已經構建瞭DataSource Bean。 - 方法
通過@Configuration、@Bean和@Value三個註解實現自定義DataSourceInitializer Bean,現在Bean的定義中實現自動化執行腳本的業務邏輯。 - 代碼
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.springframework.jdbc.datasource.init.DatabasePopulator; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import javax.sql.DataSource; @Configuration public class BatchTaskDataSourceInitializer { /** * 構建Resource對象 */ @Value("classpath:schema-all.sql") private Resource businessScript; /** * 自定義Bean實現業務的特殊需求 * @param dataSource * @return */ @Bean public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { final DataSourceInitializer initializer = new DataSourceInitializer(); // 設置數據源 initializer.setDataSource(dataSource); initializer.setDatabasePopulator(databasePopulator()); return initializer; } private DatabasePopulator databasePopulator() { final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.addScripts(businessScript); return populator; } }
註意
有兩點需要說明下:
- db文件夾下的腳本可能有多個,所以,這裡要使用PathMatchingResourcePatternResolver,讀取多個.sql的文件;
- 獲取文件的路徑是classpath*:script/db/*.sql,classpath後加個星號,意思是連jar包中的符合該規則的文件,都可以獲取到,因為該項目最終會打成jar包來運行,如果不使用這個星號,就會出現在開發的時,沒有問題,等到瞭測試或生產環境,就會出現找不到sql文件問題。當然,這裡的文件規則,需要自己定義好,不要掃到瞭本不應加載的其他包中的文件瞭。
總結
到此這篇關於Spring Boot中自動執行sql腳本的文章就介紹到這瞭,更多相關Spring Boot自動執行sql腳本內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring Boot中自動執行sql腳本的實現
- springboot多數據源使用@Qualifier自動註入無效的解決
- SpringBoot整合mybatis常見問題(小結)
- SpringBoot整合Tomcat連接池的使用
- Java之Spring註解開發案例詳解