( 三十一 )、 SpringBoot項(xiàng)目啟動(dòng)自動(dòng)執(zhí)行sql腳本
( 三十一 )、 SpringBoot項(xiàng)目啟動(dòng)自動(dòng)執(zhí)行sql腳本
方式一:在配置文件中配置相關(guān)屬性
1、關(guān)鍵屬性:
1、spring.datasource.schema:
- 表初始化語句,默認(rèn)加載schema.sql,看getScripts源碼,它還會(huì)加載schema-${platform}.sql文件,其中platform就是spring.datasource.platform的值指定DDL腳本文件
2、spring.datasource.data:
- 數(shù)據(jù)初始化,默認(rèn)加載data.sql,還會(huì)加載data-${platform}.sql文件,指定 DQL(數(shù)據(jù)查詢)腳本或DML(數(shù)據(jù)操作)腳本 文件, 一般都是數(shù)據(jù)插入腳本文件
3、spring.datasource.platform:
為了支持不同數(shù)據(jù)庫platform屬性的默認(rèn)值是’all’,所以當(dāng)有在不同數(shù)據(jù)庫切換的情況下才使用all配置,因?yàn)槟J(rèn)值的情況下,spring boot會(huì)自動(dòng)檢測當(dāng)前使用的數(shù)據(jù)庫。
4、spring.datasource.initialization-mode:
- 初始化模式(springboot2.0),其中有三個(gè)值:
- always為始終執(zhí)行初始化
- embedded只初始化內(nèi)存數(shù)據(jù)庫(默認(rèn)值),如h2等
- never為不執(zhí)行初始化
- 在SpringBoot1.x中,不需要配置便可之間運(yùn)行
- 在SpringBoot 2.x 版本中,默認(rèn)值是embedded,所以必須配置為 always
5、spring.datasource.separator
- 默認(rèn)為 ;,自定義存儲(chǔ)過程或者函數(shù)時(shí),可能需要使用delimiter設(shè)置斷句分隔符,但是delimiter在springboot執(zhí)行的sql腳本里不可用。springboot提供了spring.datasource.separator配置解決這個(gè)問題,如上配置之后,不必執(zhí)行delimiter $$$,我們?cè)谀_本里可以直接使用$$$作為分隔符。
其他屬性:
spring.datasouce.data-password
spring.datasouce.data-username
spring.datasouce.schema-password
spring.datasouce.schema-username
這四個(gè)值為執(zhí)行schema.sql或者data.sql時(shí),用的用戶
2、yml配置示例:
spring:
datasource:
schema:
- classpath:sql/schema.sql
- classpath:sql/procedure.sql
- classpath:sql/function.sql
data: classpath:sql/data.sql
initialization-mode: always
platform: mysql
separator: $$$ # 默認(rèn)為 ;
方式二: 自定義DataSourceInitializer
在SpringBoot的架構(gòu)中,DataSourceInitializer類可以在項(xiàng)目啟動(dòng)后初始化數(shù)據(jù),我們可以通過自動(dòng)執(zhí)行自定義sql腳本初始化數(shù)據(jù)。通過自定義DataSourceInitializer Bean就可以實(shí)現(xiàn)按照業(yè)務(wù)要求執(zhí)行特定的腳本。
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;
/**
* @ClassName CustomizeDataSourceInitializer
* @Description: TODO
* @Author guoshihua
* @Date 2020/5/5 0005 下午 3:47
* @Version V1.0
* @See 版權(quán)聲明
**/
@Configuration
public class CustomizeDataSourceInitializer {
@Value("classpath:sql/schema.sql")
private Resource sqlScriptSchema;
@Value("classpath:sql/data.sql")
private Resource sqlScriptData;
@Value("classpath:sql/procedure.sql")
private Resource sqlScriptProcedure;
@Value("classpath:sql/function.sql")
private Resource sqlScriptFunction;
@Bean
public DataSourceInitializer dataSourceInitializer(final DataSource dataSource){
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(databasePopulator());
return dataSourceInitializer;
}
private DatabasePopulator databasePopulator(){
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(sqlScriptSchema);
populator.addScript(sqlScriptData);
populator.addScript(sqlScriptProcedure);
populator.addScript(sqlScriptFunction);
populator.setSeparator("$$$"); // 分隔符,默認(rèn)為;
return populator;
}
}
3、不同運(yùn)行環(huán)境執(zhí)行不同腳本
一般情況下,都會(huì)有多個(gè)運(yùn)行環(huán)境,比如開發(fā)、測試、生產(chǎn)等。而不同運(yùn)行環(huán)境通常需要執(zhí)行的sql會(huì)有所不同。為解決這個(gè)問題,可以使用通配符來實(shí)現(xiàn)。
創(chuàng)建不同環(huán)境的文件夾
在 resources 文件夾創(chuàng)建不同環(huán)境對(duì)應(yīng)的文件夾,如dev/、test/、prod/。
配置 : application.yml
spring:
datasource:
schema: classpath:${spring.profiles.active:dev}/schema.sql
data: classpath:${spring.profiles.active:dev}/data.sql
initialization-mode: always
platform: mysql
separator: $$$ # 默認(rèn)為 ;
注:\${}通配符支持缺省值。如上面的配置中的`${spring.profiles.active:dev}`,其中分號(hào)前是取屬性spring.profiles.active的值,而當(dāng)該屬性的值不存在,則使用分號(hào)后面的值,即dev。

浙公網(wǎng)安備 33010602011771號(hào)