SpringBoot启动执行sql脚本的3种方法实例

目录
  • 背景
  • 配置application.yml文件
  • 自定义DataSourceInitializer Bean
  • 启动时执行方法
  • Springboot自动执行sql文件
  • 总结

背景

项目里后端需要计算坐标距离,想用sql实现算法,然后通过执行一个sql脚本,创建一个函数供各业务调用。我们需要在springboot项目启动时执行sql脚本,在网上一顿搜索,总结了有三种做法:

  • 配置application.yml文件
  • 自定义DataSourceInitializer Bean
  • 启动时执行方法

第一种做法最方便简洁,是首选方案,但是由于种种原因项目里不能用,只能选择使用第二种做法。第三种做法不推荐,这里只当是记录一下做过的工作。

开发调测sql脚本的时候,推荐使用这个驱动,可以让我们看到sql执行日志,有没有执行?报了什么异常?

spring
  datasource
    driver-class-name: net.sf.log4jdbc.DriverSpy
<dependency>
    <groupId>com.googlecode.log4jdbc</groupId>
    <artifactId>log4jdbc</artifactId>
    <version>1.2</version>
    <scope>runtime</scope>
</dependency>

同时,spring.datasource.url的配置应该如下起头

spring
  datasource
    url: 'jdbc:log4jdbc:mysql://XXXXX'

配置application.yml文件

spring:
  datasource:
    username: root
    password: root
    driver-class-name: net.sf.log4jdbc.DriverSpy
    url: jdbc:log4jdbc:mysql://localhost:3306/springboot
    schema:
      - classpath:sql/function.sql
      - classpath:sql/procedure.sql
    initialization-mode: ALWAYS
    separator:\\

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

以下两种情况会导致启动时sql脚本不执行:

1.启动类上的注解如果配置了exclude={DataSourceAutoConfiguration.class},sql脚本将不被执行。

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

2.如果开启了druid连接池的防火墙,sql脚本将不被执行。

spring
  datasource
    druid
      filter
        wall
          enabled: true

自定义DataSourceInitializer Bean

参考博文:Spring Boot中自动执行sql脚本

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
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;

public class CustomizeDataSourceInitializer {

    @Value("classpath:sql/function.sql")
    private Resource functionScript;

    @Bean
    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
        final DataSourceInitializer initializer = new DataSourceInitializer();
        // 设置数据源
        initializer.setDataSource(dataSource);
        initializer.setDatabasePopulator(databasePopulator());
        return initializer;
    }

    private DatabasePopulator databasePopulator() {
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScripts(functionScript);
        populator.setSeparator("$$");
        return populator;
    }
}

populator.setSeparator("$$")的作用和配置spring.datasource.separator一样。

启动时执行方法

参考博文:springboot启动前执行方法的几种方式

三种实现方式:

第一种 @PostConstruct注解

第二种 实现InitializingBean接口

第三种 实现BeanPostProcessor接口

这种做法思路就是启动时调用MyBatis接口,但是受限于Mybatis的用法规则,不能完美的满足需求,比如,执行的sql脚本只能有一条语句,这样的话,如果我要创建两个存储过程,需要先后调用两个MyBatis接口。我们不必这么做,前两种做法更好。

Springboot自动执行sql文件

在springboot1.5及以前的版本,要执行sql文件只需在applicaion文件里指定sql文件的位置即可。但是到了springboot2.x版本,

如果只是这样做的话springboot不会自动执行sql文件,还需在applicaion文件里加入如下配置

initialization-mode: always

这样springboot就会帮我们自动执行sql了

注意:!!!

建表完成后如果不再需要使用sql文件的话要把sql文件删除,否则springboot会重新建表,这样原来表中的内容就没有了!!!

总结

到此这篇关于SpringBoot启动执行sql脚本的3种方法的文章就介绍到这了,更多相关SpringBoot启动执行sql脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot启动时自动执行sql脚本的方法步骤

    需要配置项目下的yml文件: 在文件下加如如下配置: data: classpath:code-generator-data.sql initialization-mode: always spring.datasource.initialization-mode: 初始化模式(springboot2.0),其中有三个值: always为始终执行初始化 embedded只初始化内存数据库(默认值),如h2等 never为不执行初始化 spring.datasource.data: 数据初始化,默

  • SpringBoot启动执行sql脚本的3种方法实例

    目录 背景 配置application.yml文件 自定义DataSourceInitializer Bean 启动时执行方法 Springboot自动执行sql文件 总结 背景 项目里后端需要计算坐标距离,想用sql实现算法,然后通过执行一个sql脚本,创建一个函数供各业务调用.我们需要在springboot项目启动时执行sql脚本,在网上一顿搜索,总结了有三种做法: 配置application.yml文件 自定义DataSourceInitializer Bean 启动时执行方法 第一种做法

  • mysql命令行下执行sql文件的几种方法

    目录 第一种方法:未连接mysql数据库时 第二方法:在已经连接数据库的情况下,此时命令提示符为mysql>, 用MySQL的source命令导入SQL文件实战记录 达到目的:通过命令行的方式,将tsinfo180516.sql文件导入到数据库demo1中. 效果图 第一种方法:未连接mysql数据库时 在mysql命令行下执行sql文件 运行--cmd C:\Users\lenovo>mysql -u账号 -p密码 -D数据库名 < sql文件绝对路径 C:\Users\lenovo&

  • Django执行指定脚本的几种方法

    目录 前言 Django Shell 自定义Command Django extensions 总结 前言 用Django写项目,遇到临时需要处理数据库的问题时,会考虑直接让脚本在项目环境中运行,这样就可以直接用定义好的模型和方法了. 这里提供几种方法,通过Django执行指定的脚本,让脚本直接在Django项目的环境中来运行. Django Shell Django自带的shell其实就加载了项目的各种环境变量,网上描述得也很多,直接这么跑就可以了: python manage.py shel

  • Linux中执行shell脚本的4种方法总结

    bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在

  • 让Linux下的cron以秒为单位执行shell脚本的3种方法

    需要用到Shell脚本每隔3秒钟去监控一个软件进程的运行状态,发现crond似乎只支持到分,不知道秒,怎么办呢? 第一种方法: 当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如下: cat kick.sh 复制代码 代码如下: #!/bin/bash while : ;do  /home/somedir/scripts.sh 2>/dev/null &  sleep 3 done 注意第一次运行时请不要使用 bash kick.sh & 这种后台运行的方式,它

  • 执行Shell脚本的4种方法及区别介绍

    执行shell脚本有以下几种方式 1.相对路径方式,需先cd到脚本路径下 复制代码 代码如下: [root@banking tmp]# cd /tmp  [root@banking tmp]# ./ceshi.sh 脚本执行成功 2.绝对路径方式 复制代码 代码如下: [root@banking tmp]# /tmp/ceshi.sh 脚本执行成功 3.bash命令调用 复制代码 代码如下: [root@banking /]# bash /tmp/ceshi.sh 脚本执行成功 4.. (空格)

  • Springboot启动执行特定代码的方式汇总

    目录 实现InitializingBean接口或使用@PostConstruct注解 实现ApplicationListener接口 实现CommandLineRunner或ApplicationRunner 接口 实现InitializingBean接口或使用@PostConstruct注解 实现InitializingBean如下 public class AnotherExampleBean implements InitializingBean { @Override public vo

  • SpringBoot启动并初始化执行sql脚本问题

    目录 SpringBoot启动并初始化执行sql脚本 我们先看一下源码 下面我们验证一下这两种方式 SpringBoot项目在启动时执行指定sql文件 1. 启动时执行 2. 执行多个sql文件 3. 不同运行环境执行不同脚本 4. 支持不同数据库 5. 避坑 总结 SpringBoot启动并初始化执行sql脚本 如果我们想在项目启动的时候去执行一些sql脚本该怎么办呢,SpringBoot给我们提供了这个功能,可以在启动SpringBoot的项目时,执行脚本,下面我们来看一下. 我们先看一下源

  • Spring执行sql脚本文件的方法

    本篇解决 Spring 执行SQL脚本(文件)的问题. 场景描述可以不看. 场景描述: 我在运行单测的时候,也就是 Spring 工程启动的时候,Spring 会去执行 classpath:schema.sql(后面会解释),我想利用这一点,解决一个问题: 一次运行多个测试文件,每个文件先后独立运行,而上一个文件创建的数据,会对下一个文件运行时造成影响,所以我要在每个文件执行完成之后,重置数据库,不单单是把数据删掉,而 schema.sql 里面有 drop table 和create tabl

随机推荐