( 三十一 )、 SpringBoot项目启动自动执行sql脚本

摘要:
它还加载模式-${platform}。sql文件以及数据-${platform}。sql文件,模式:classpath:importarg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;

( 三十一 )、 SpringBoot项目启动自动执行sql脚本

方式一:在配置文件中配置相关属性

1、关键属性:

1、spring.datasource.schema:

  • 表初始化语句,默认加载schema.sql,看getScripts源码,它还会加载schema-${platform}.sql文件,其中platform就是spring.datasource.platform的值指定DDL脚本文件

2、spring.datasource.data:

  • 数据初始化,默认加载data.sql,还会加载data-${platform}.sql文件,指定 DQL(数据查询)脚本或DML(数据操作)脚本 文件, 一般都是数据插入脚本文件

3、spring.datasource.platform:
为了支持不同数据库platform属性的默认值是’all’,所以当有在不同数据库切换的情况下才使用all配置,因为默认值的情况下,spring boot会自动检测当前使用的数据库。

4、spring.datasource.initialization-mode:

  • 初始化模式(springboot2.0),其中有三个值:
  1. always为始终执行初始化
  2. embedded只初始化内存数据库(默认值),如h2等
  3. never为不执行初始化
  4. 在SpringBoot1.x中,不需要配置便可之间运行
  5. 在SpringBoot 2.x 版本中,默认值是embedded,所以必须配置为 always

5、spring.datasource.separator

  • 默认为 ;,自定义存储过程或者函数时,可能需要使用delimiter设置断句分隔符,但是delimiter在springboot执行的sql脚本里不可用。springboot提供了spring.datasource.separator配置解决这个问题,如上配置之后,不必执行delimiter $$$,我们在脚本里可以直接使用$$$作为分隔符。

其他属性:
spring.datasouce.data-password
spring.datasouce.data-username
spring.datasouce.schema-password
spring.datasouce.schema-username
这四个值为执行schema.sql或者data.sql时,用的用户

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: $$$ # 默认为 ;

方式二: 自定义DataSourceInitializer

 在SpringBoot的架构中,DataSourceInitializer类可以在项目启动后初始化数据,我们可以通过自动执行自定义sql脚本初始化数据。通过自定义DataSourceInitializer Bean就可以实现按照业务要求执行特定的脚本。

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 版权声明
 **/
@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("$$$"); // 分隔符,默认为;
        return populator;
    }
}
3、不同运行环境执行不同脚本

一般情况下,都会有多个运行环境,比如开发、测试、生产等。而不同运行环境通常需要执行的sql会有所不同。为解决这个问题,可以使用通配符来实现。

创建不同环境的文件夹
在 resources 文件夹创建不同环境对应的文件夹,如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: $$$ # 默认为 ;

 注:${}通配符支持缺省值。如上面的配置中的`${spring.profiles.active:dev}`,其中分号前是取属性spring.profiles.active的值,而当该属性的值不存在,则使用分号后面的值,即dev。

免责声明:文章转载自《( 三十一 )、 SpringBoot项目启动自动执行sql脚本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mac下nginx、redisSpring Boot AOP 切面统一打印请求与响应日志下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

简单MVC项目搭建--Java1.7+Eclipse luna + Maven 3.2.5 +spring 4.1.4

转载请注明出处:http://www.cnblogs.com/mybest/p/4265872.html 1、 环境配置 a) Java 1.7 b) Eclipse luna c) Maven3.2.5 d) Spring 4.1.4 2、 创建maven工程 a) 打开eclipse,file->new->project->Maven...

jquery.validate.js的Validate表单验证

原文连接 https://blog.csdn.net/weixin_42765270/article/details/84591593 validate 一、 validate的使用步骤 引入jquery.min.js 引入 jquery.validate.js 页面加载后对表单进行验证 $("#表单id名").validate({}) 在valid...

ubuntu18.04 自启动程序开启Root权限

开机自启动ROOT权限运行脚本 一、操作系统 版本:ubuntu18.04 安装包名称:ubuntu-18.04.4-desktop-amd64.iso 制作脚本1.创建文件_password,内容是:#!/bin/bash echo "1313" (这个填写自己的root密码,蓝色的部分) 2.创建脚本matLab_ui.sh#!/bin/sh cd /...

测试工具的选择和使用

Parasoft白盒测试工具集 工具名 支持语言环境 简介...

检验多个xsd的xml是否合法

Java - 使用 XSD 校验 XML https://www.cnblogs.com/huey/p/4600817.html 这种方法不支持多个xsd文件,会报错 可以使用XMLBeans Tools来验证,3.1的版本用起来有问题,后来用2.6版本的就OK了 利用xmlbeans工具对xml格式进行验证(需要xsd文件) https://blog....

WAI-ARIA无障碍网页资料

西门小白菜 我很骄傲,因为我是小白菜一枚! WAI-ARIA无障碍网页资料 一、ARIA是啥?      WAI-ARIA指无障碍网页应用。主要针对的是视觉缺陷,失聪,行动不便的残疾人以及假装残疾的测试人员。尤其像盲人,眼睛看不到,其浏览网页则需要借助辅助设备,如屏幕阅读器,屏幕阅读机可以大声朗读或者输出盲文。而ARIA就是可以让屏幕阅读器准确识别...