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

 更新时间:2022年01月10日 11:13:19   作者:AtongWood  
在应用程序启动后,可以自动执行建库、建表等SQL脚本,下面这篇文章主要给大家介绍了关于SpringBoot启动执行sql脚本的3种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

背景

项目里后端需要计算坐标距离,想用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脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis图文并茂讲解分页插件

    Mybatis图文并茂讲解分页插件

    使用过mybatis的人都知道,mybatis本身就很小且简单,sql写在xml里,统一管理和优化。缺点当然也有,比如我们使用过程中,要使用到分页,如果用最原始的方式的话,1.查询分页数据,2.获取分页长度,也就是说要使用到两个方法才能完成分页
    2022-07-07
  • SWT(JFace)小制作 FileBrowser文件浏览

    SWT(JFace)小制作 FileBrowser文件浏览

    SWT(JFace)小制作 FileBrowser文件浏览
    2009-06-06
  • SpringBoot多种环境自由切换的实现

    SpringBoot多种环境自由切换的实现

    本文主要介绍了SpringBoot多种环境自由切换的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Spring+SpringMVC+Hibernate整合实例讲解

    Spring+SpringMVC+Hibernate整合实例讲解

    在本篇文章里小编给大家整理的是关于Spring+SpringMVC+Hibernate整合实例讲解,需要的朋友们可以学习下。
    2020-03-03
  • maven学习-初窥门径

    maven学习-初窥门径

    这篇文章主要介绍了maven的简单知识,介绍了maven的定义及核心功能,具有一定参考价值,大家可以了解下。
    2017-10-10
  • springboot+VUE前后端分离实现疫情防疫平台JAVA

    springboot+VUE前后端分离实现疫情防疫平台JAVA

    本文主要使用了Java、springmvc、VUE、node.js、mybatis、mysql、tomcat、jquery、layui、bootstarp、JavaScript、html、css、jsp、log4j等一些常见的基本技术,实现一个疫情防疫小平台
    2021-08-08
  • 如何解决 Java 中的 IndexOutOfBoundsException 异常(最新推荐)

    如何解决 Java 中的 IndexOutOfBoundsException 异

    当我们在 Java 中使用 List 的时候,有时候会出现向 List 中不存在的位置设置新元素的情况,从而导致 IndexOutOfBoundsException 异常,本文将会介绍这个问题的产生原因以及解决方案
    2023-10-10
  • Zookeeper连接超时问题与拒绝连接的解决方案

    Zookeeper连接超时问题与拒绝连接的解决方案

    今天小编就为大家分享一篇关于Zookeeper连接超时问题与拒绝连接的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Spring整合Quartz实现定时任务调度的方法

    Spring整合Quartz实现定时任务调度的方法

    下面小编就为大家带来一篇Spring整合Quartz实现定时任务调度的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java超详细教你写一个学籍管理系统案例

    Java超详细教你写一个学籍管理系统案例

    这篇文章主要介绍了怎么用Java来写一个学籍管理系统,学籍管理主要涉及到学生信息的增删查改,本篇将详细的实现,感兴趣的朋友跟随文章往下看看吧
    2022-03-03

最新评论