Springboot2.x 自動創建表並且執行初始化數據


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














免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM