1.使用springboot jdbc初始化數據庫
項目結構
schema.sql
drop table if exists user; create table user (id bigint(20) not null auto_increment, username varchar(40) DEFAULT NULL, name varchar(20) DEFAULT NULL, age int(3) DEFAULT NULL, balance decimal(10,2) DEFAULT NULL, primary key(id))ENGINE=InnoDB DEFAULT CHARSET=utf8;
data.sql
insert into user (id, username, name, age, balance) values (1,'account1','張三', 20, 100.00); insert into user (id, username, name, age, balance) values (2,'account2','李四', 28, 180.00); insert into user (id, username, name, age, balance) values (3,'account3','王五', 32, 280.00);
在SpringBoot1.x中, 運行schema.sql不需要配置便可之間運行,但是在SpringBoot2.x中,我們需要在配置文件中配置一下:
spring.datasource.initialization-mode: always
數據庫配置:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test-xc?useSSL=false&useUnicode=true&characterEncoding=UTF8 spring.datasource.username=root spring.datasource.password=root spring.datasource.platform=mysql spring.datasource.separator=; spring.datasource.schema=classpath:schema.sql spring.datasource.data=classpath:data.sql spring.datasource.initialization-mode=always #顯示SQL語句 spring.jpa.show-sql=true #不加下面這句則不會默認創建MyISAM引擎的數據庫 spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.datasource下有兩個屬性 schme、data,其中schema為表初始化語句,data為數據初始化,默認加載schema.sql與data.sql。腳本位置可以通過spring.datasource.schema 與spring.datasource.data 來改變,源碼如下:
/** * Create the schema if necessary. * @return {@code true} if the schema was created * @see DataSourceProperties#getSchema() */ 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(); } /** * Initialize the schema if necessary. * @see DataSourceProperties#getData() */ public void initSchema() { List<Resource> scripts = getScripts("spring.datasource.data", this.properties.getData(), "data"); if (!scripts.isEmpty()) { if (!isEnabled()) { logger.debug("Initialization disabled (not running data scripts)"); return; } String username = this.properties.getDataUsername(); String password = this.properties.getDataPassword(); runScripts(scripts, username, password); } }
看getScripts源碼,它還會加載schema-${platform}.sql文件,或者data-${platform}.sql文件,其中platform就是spring.datasource.platform的值
private List<Resource> getScripts(String propertyName, List<String> resources, String fallback) { if (resources != null) { return getResources(propertyName, resources, true); } String platform = this.properties.getPlatform(); List<String> fallbackResources = new ArrayList<>(); fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); fallbackResources.add("classpath*:" + fallback + ".sql"); return getResources(propertyName, fallbackResources, false); }
spring.datasource.initialization-mode 初始化模式(springboot2.0),其中有三個值,always為始終執行初始化,embedded只初始化內存數據庫(默認值),如h2等,never為不執行初始化。
1 /* 2 * Copyright 2012-2017 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.springframework.boot.jdbc; 18 19 /** 20 * Supported {@link javax.sql.DataSource} initialization modes. 21 * 22 * @author Vedran Pavic 23 * @author Stephane Nicoll 24 * @since 2.0.0 25 * @see AbstractDataSourceInitializer 26 */ 27 public enum DataSourceInitializationMode { 28 29 /** 30 * Always initialize the datasource. 31 */ 32 ALWAYS, 33 34 /** 35 * Only initialize an embedded datasource. 36 */ 37 EMBEDDED, 38 39 /** 40 * Do not initialize the datasource. 41 */ 42 NEVER 43 44 }
spring.datasouce.data-passwork:
spring.datasouce.data-username:
spring.datasouce.schema-password:
spring.datasouce.schema-username:
這四個值為執行schema.sql或者data.sql時,用的用戶
spring.datasource.sql-script-encoding: utf-8 為文件的編碼
spring.datasource.separator: ; 為sql腳本中語句分隔符
spring.datasource.continue-on-error: false 遇到語句錯誤時是否繼續,若已經執行過某些語句,再執行可能會報錯,可以忽略,不會影響程序啟動
2.使用hibernate初始化數據庫
1 spring: 2 jpa: 3 show-sql: true 4 #啟動時是否初始化數據庫-hibernate 5 generate-ddl: false 6 hibernate: 7 ddl-auto: update
generate-ddl: 為true時,執行schema創建,會檢測classpath下的import.sql文件,當然spring.jpa.hibernate.ddl-auto: 必須為create/update/create-drop,none和validate是不行的,因為這個創建時hibernate的,所以建議用spring的
轉載至Springboot(二十)啟動時數據庫初始化spring.datasource/spring.jpa