SpringBoot啟動(dòng)執(zhí)行sql腳本的3種方法實(shí)例
背景
項(xiàng)目里后端需要計(jì)算坐標(biāo)距離,想用sql實(shí)現(xiàn)算法,然后通過(guò)執(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)是記錄一下做過(guò)的工作。
開(kāi)發(fā)調(diào)測(cè)sql腳本的時(shí)候,推薦使用這個(gè)驅(qū)動(dòng),可以讓我們看到sql執(zhí)行日志,有沒(méi)有執(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ǔ)過(guò)程或者函數(shù)時(shí),可能需要使用delimiter設(shè)置斷句分隔符,但是delimiter在springboot執(zhí)行的sql腳本里不可用。springboot提供了spring.datasource.separator配置解決這個(gè)問(wèn)題,如上配置之后,不必執(zhí)行delimiter \\,我們?cè)谀_本里可以直接使用\\作為分隔符。
以下兩種情況會(huì)導(dǎo)致啟動(dòng)時(shí)sql腳本不執(zhí)行:
1.啟動(dòng)類(lèi)上的注解如果配置了exclude={DataSourceAutoConfiguration.class},sql腳本將不被執(zhí)行。
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
2.如果開(kāi)啟了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ī)則,不能完美的滿(mǎn)足需求,比如,執(zhí)行的sql腳本只能有一條語(yǔ)句,這樣的話(huà),如果我要?jiǎng)?chuàng)建兩個(gè)存儲(chǔ)過(guò)程,需要先后調(diào)用兩個(gè)MyBatis接口。我們不必這么做,前兩種做法更好。
Springboot自動(dòng)執(zhí)行sql文件
在springboot1.5及以前的版本,要執(zhí)行sql文件只需在applicaion文件里指定sql文件的位置即可。但是到了springboot2.x版本,
如果只是這樣做的話(huà)springboot不會(huì)自動(dòng)執(zhí)行sql文件,還需在applicaion文件里加入如下配置
initialization-mode: always

這樣springboot就會(huì)幫我們自動(dòng)執(zhí)行sql了
注意:?。?!
建表完成后如果不再需要使用sql文件的話(huà)要把sql文件刪除,否則springboot會(huì)重新建表,這樣原來(lái)表中的內(nèi)容就沒(mé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框架中AOP及動(dòng)態(tài)代理的應(yīng)用
在軟件業(yè),AOP為Aspect?Oriented?Programming的縮寫(xiě),意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)2022-03-03
基于Spring Data的AuditorAware審計(jì)功能的示例代碼
這篇文章主要介紹了基于Spring Data的AuditorAware審計(jì)功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
springcloud之Feign、ribbon如何設(shè)置超時(shí)時(shí)間和重試機(jī)制
這篇文章主要介紹了springcloud之Feign、ribbon如何設(shè)置超時(shí)時(shí)間和重試機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java實(shí)現(xiàn)監(jiān)控rtsp流轉(zhuǎn)flv方法實(shí)例(前端播放,前后端代碼都有)
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)監(jiān)控rtsp流轉(zhuǎn)flv的相關(guān)資料,文中介紹的是前端播放,前后端代碼都有,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
java如何拷貝復(fù)制對(duì)象和集合問(wèn)題
這篇文章主要介紹了java如何拷貝復(fù)制對(duì)象和集合問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Java并發(fā)之ReentrantLock類(lèi)源碼解析
這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之ReentrantLock源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
MyBatis多對(duì)多關(guān)聯(lián)映射創(chuàng)建示例
這篇文章主要為大家介紹了MyBatis多對(duì)多關(guān)聯(lián)映射的創(chuàng)建示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
使用javaMail實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了使用javaMail實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
在win10系統(tǒng)下,如何配置Spring Cloud alibaba Seata以及出現(xiàn)問(wèn)題時(shí)怎么解決
今天教大家如何在win10系統(tǒng)下,配置Spring Cloud alibaba Seata以及出現(xiàn)問(wèn)題時(shí)怎么解決,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

