SpringBoot啟動(dòng)執(zhí)行sql腳本的3種方法實(shí)例
背景
項(xiàng)目里后端需要計(jì)算坐標(biāo)距離,想用sql實(shí)現(xiàn)算法,然后通過執(zhí)行一個(gè)sql腳本,創(chuàng)建一個(gè)函數(shù)供各業(yè)務(wù)調(diào)用。我們需要在springboot項(xiàng)目啟動(dòng)時(shí)執(zhí)行sql腳本,在網(wǎng)上一頓搜索,總結(jié)了有三種做法:
- 配置application.yml文件
- 自定義DataSourceInitializer Bean
- 啟動(dòng)時(shí)執(zhí)行方法
第一種做法最方便簡(jiǎn)潔,是首選方案,但是由于種種原因項(xiàng)目里不能用,只能選擇使用第二種做法。第三種做法不推薦,這里只當(dāng)是記錄一下做過的工作。
開發(fā)調(diào)測(cè)sql腳本的時(shí)候,推薦使用這個(gè)驅(qū)動(dòng),可以讓我們看到sql執(zhí)行日志,有沒有執(zhí)行?報(bào)了什么異常?
spring datasource driver-class-name: net.sf.log4jdbc.DriverSpy
<dependency> <groupId>com.googlecode.log4jdbc</groupId> <artifactId>log4jdbc</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency>
同時(shí),spring.datasource.url的配置應(yīng)該如下起頭
spring datasource url: 'jdbc:log4jdbc:mysql://XXXXX'
配置application.yml文件
spring: datasource: username: root password: root driver-class-name: net.sf.log4jdbc.DriverSpy url: jdbc:log4jdbc:mysql://localhost:3306/springboot schema: - classpath:sql/function.sql - classpath:sql/procedure.sql initialization-mode: ALWAYS separator:\\
自定義存儲(chǔ)過程或者函數(shù)時(shí),可能需要使用delimiter設(shè)置斷句分隔符,但是delimiter在springboot執(zhí)行的sql腳本里不可用。springboot提供了spring.datasource.separator配置解決這個(gè)問題,如上配置之后,不必執(zhí)行delimiter \\,我們?cè)谀_本里可以直接使用\\作為分隔符。
以下兩種情況會(huì)導(dǎo)致啟動(dòng)時(shí)sql腳本不執(zhí)行:
1.啟動(dòng)類上的注解如果配置了exclude={DataSourceAutoConfiguration.class},sql腳本將不被執(zhí)行。
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
2.如果開啟了druid連接池的防火墻,sql腳本將不被執(zhí)行。
spring datasource druid filter wall enabled: true
自定義DataSourceInitializer Bean
參考博文:Spring Boot中自動(dòng)執(zhí)行sql腳本
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; 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; public class CustomizeDataSourceInitializer { @Value("classpath:sql/function.sql") private Resource functionScript; @Bean public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { final DataSourceInitializer initializer = new DataSourceInitializer(); // 設(shè)置數(shù)據(jù)源 initializer.setDataSource(dataSource); initializer.setDatabasePopulator(databasePopulator()); return initializer; } private DatabasePopulator databasePopulator() { final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.addScripts(functionScript); populator.setSeparator("$$"); return populator; } }
populator.setSeparator("$$")的作用和配置spring.datasource.separator一樣。
啟動(dòng)時(shí)執(zhí)行方法
參考博文:springboot啟動(dòng)前執(zhí)行方法的幾種方式
三種實(shí)現(xiàn)方式:
第一種 @PostConstruct注解
第二種 實(shí)現(xiàn)InitializingBean接口
第三種 實(shí)現(xiàn)BeanPostProcessor接口
這種做法思路就是啟動(dòng)時(shí)調(diào)用MyBatis接口,但是受限于Mybatis的用法規(guī)則,不能完美的滿足需求,比如,執(zhí)行的sql腳本只能有一條語(yǔ)句,這樣的話,如果我要?jiǎng)?chuàng)建兩個(gè)存儲(chǔ)過程,需要先后調(diào)用兩個(gè)MyBatis接口。我們不必這么做,前兩種做法更好。
Springboot自動(dòng)執(zhí)行sql文件
在springboot1.5及以前的版本,要執(zhí)行sql文件只需在applicaion文件里指定sql文件的位置即可。但是到了springboot2.x版本,
如果只是這樣做的話springboot不會(huì)自動(dòng)執(zhí)行sql文件,還需在applicaion文件里加入如下配置
initialization-mode: always
這樣springboot就會(huì)幫我們自動(dòng)執(zhí)行sql了
注意:?。?!
建表完成后如果不再需要使用sql文件的話要把sql文件刪除,否則springboot會(huì)重新建表,這樣原來表中的內(nèi)容就沒有了?。?!
總結(jié)
到此這篇關(guān)于SpringBoot啟動(dòng)執(zhí)行sql腳本的3種方法的文章就介紹到這了,更多相關(guān)SpringBoot啟動(dòng)執(zhí)行sql腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring Cloud Feign作為HTTP客戶端調(diào)用遠(yuǎn)程HTTP服務(wù)的方法(推薦)
在Spring Cloud中使用Feign, 我們可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求,具體內(nèi)容詳情大家參考下本文2018-01-01如何將java或javaweb項(xiàng)目打包為jar包或war包
本文主要介紹了如何將java或javaweb項(xiàng)目打包為jar包或war包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)示例
Java動(dòng)態(tài)數(shù)組是一種可以任意伸縮數(shù)組長(zhǎng)度的對(duì)象,本文主要介紹了Java 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08SpringBoot項(xiàng)目配置明文密碼泄露問題的處理方式
這篇文章主要介紹了SpringBoot項(xiàng)目配置明文密碼泄露問題的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06IDEA無法打開Marketplace的三種解決方案(推薦)
這篇文章主要介紹了IDEA無法打開Marketplace的三種解決方案(推薦),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11基于Java寫minio客戶端實(shí)現(xiàn)上傳下載文件
這篇文章主要介紹了基于Java寫minio客戶端實(shí)現(xiàn)上傳下載文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署的案例詳解
這篇文章主要介紹了使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署,Spring Cloud僅僅是一個(gè)開發(fā)框架,沒有實(shí)現(xiàn)微服務(wù)所必須的服務(wù)調(diào)度、資源分配等功能,這些需求要借助Kubernetes等平臺(tái)來完成,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06