緣起
最近在用 spring boot 搞單元測試時候需要在測試初始時重建數據庫表結構以及載入一些測試數據,本來打算自己寫個初始化 SQL 的方法,結果發現 spring boot 自身已經提供了此功能。
實現
具體實現可參考 org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer
,裏面有兩個方法 createSchema
、initSchema
。
前者可以用來執行 ddl 腳本重建數據庫表結構,後者可以用來初始化一些測試數據,其實二者的實現是基本一樣的,這點區別算是語義上的。
隨便貼點源碼基本就明白了:
public boolean createSchema() {
List<Resource> scripts = getScripts("spring.datasource.schema",
this.properties.getSchema(), "schema");
if (!scripts.isEmpty()) {
if (!isEnabled()) {
logger.debug("Initialization disabled (not running DDL scripts)");
return false;
}
String username = this.properties.getSchemaUsername();
String password = this.properties.getSchemaPassword();
runScripts(scripts, username, password);
}
return !scripts.isEmpty();
}
原理很簡單,在配置文件中配置 schema
和 data
指向相應的 SQL 文件即可,例如 application.yml
:
spring:
profiles:
active: test
output.ansi.enabled: ALWAYS
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/xxx
username: root
password: root
initialization-mode: always
schema:
- classpath*:table-drop-ddl.sql
- classpath*:table-create-ddl.sql
重點是下面幾行,initialization-mode
參見 org.springframework.boot.jdbc.DataSourceInitializationMode
,因爲用了第三方連接池,所以這兒需要使用 always
。
而 schema
則是指向的初始化 SQL 腳本位置,我這兒是分爲兩個,一個用來刪除表,一個用來創建表。
如果需要初始化數據,則可以使用 data
,具體模式與 schema
一致。
額外
如果想要在輸出中查看此操作的詳細日誌,可以類似如下配置:
<logger name="org.springframework.jdbc.datasource.init" level="DEBUG"/>
Over