• Spring Boot启动时数据库初始化spring.datasource(转)


    原文:https://blog.csdn.net/u012326462/article/details/82080812

    1.使用springboot jdbc初始化数据库

    spring:
      datasource:
        username: xuhaixing
        password: xuhaixing
        url: jdbc:mysql://192.168.94.151:3306/mytest?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
        driver-class-name: com.mysql.jdbc.Driver
        platform: mysql
        #启动时需要初始化的建表语句
        schema: classpath:schema-mysql.sql
        #初始化的数据
        data: classpath:data-mysql.sql
        # Initialize the datasource with available DDL and DML scripts.
        initialization-mode: always
        continue-on-error: false
        #data-password:
        #data-username:
        #schema-password:
        #schema-username:
        sql-script-encoding: utf-8
        separator: ;

    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);
        }
        
        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为不执行初始化。

    /*
     * Copyright 2012-2017 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
     
    package org.springframework.boot.jdbc;
     
    /**
     * Supported {@link javax.sql.DataSource} initialization modes.
     *
     * @author Vedran Pavic
     * @author Stephane Nicoll
     * @since 2.0.0
     * @see AbstractDataSourceInitializer
     */
    public enum DataSourceInitializationMode {
     
        /**
         * Always initialize the datasource.
         */
        ALWAYS,
     
        /**
         * Only initialize an embedded datasource.
         */
        EMBEDDED,
     
        /**
         * Do not initialize the datasource.
         */
        NEVER
     
    }

    spring.datasouce.data-password:

    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 遇到语句错误时是否继续,若已经执行过某些语句,再执行可能会报错,可以忽略,不会影响程序启动

  • 相关阅读:
    JavaScript Validator 报错
    JSP项目_Web路径_磁盘物理路径
    TreaponseHeader
    TrequestHeader
    HTML学习笔记1
    SQL文摘:DATE_TRUNC: A SQL Timestamp Function You Can Count On
    SQL文摘:Writing Subqueries in SQL
    Python文摘:Requests (Adavanced Usage)
    Python文摘:Requests
    Python文摘:More About Unicode in Python 2 and 3
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/16851019.html
Copyright © 2020-2023  润新知