Spring Boot中自动执行sql脚本的方法实例

 更新时间:2022年01月10日 10:38:46   作者:大哥你先走  
在SpringBoot的架构中,DataSourceInitializer类可以在项目启动后初始化数据,我们可以通过自动执行自定义sql脚本初始化数据,下面这篇文章主要给大家介绍了关于Spring Boot中自动执行sql脚本的相关资料,需要的朋友可以参考下

说明:所有的代码基于SpringBoot 2.0.3版本

背景

在应用程序启动后,可以自动执行建库、建表等SQL脚本.下文中以要自动化执行people.sql脚本为例说明,脚本在SpringBoot工程中的路径为:classpath:people.sql,脚本的具体内容如下:

CREATE TABLE IF NOT EXISTS people(
    persion_id BIGINT NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(20),
    last_name VARCHAR(20),
    PRIMARY KEY (persion_id)
);

实现核心

在SpringBoot的架构中,DataSourceInitializer类可以实现自动执行脚本的功能。通过自定义DataSourceInitializer Bean就可以实现按照业务要求执行特定的脚本。

实现方法

  • 前提
    已经构建了DataSource Bean。
  • 方法
    通过@Configuration、@Bean和@Value三个注解实现自定义DataSourceInitializer Bean,现在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;
@Configuration
public class BatchTaskDataSourceInitializer {
    /**
     * 构建Resource对象
     */
    @Value("classpath:schema-all.sql")
    private Resource businessScript;

    /**
     * 自定义Bean实现业务的特殊需求
     * @param dataSource
     * @return
     */
    @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(businessScript);
        return populator;
    }
}

注意

有两点需要说明下:

  • db文件夹下的脚本可能有多个,所以,这里要使用PathMatchingResourcePatternResolver,读取多个.sql的文件;
  • 获取文件的路径是classpath*:script/db/*.sql,classpath后加个星号,意思是连jar包中的符合该规则的文件,都可以获取到,因为该项目最终会打成jar包来运行,如果不使用这个星号,就会出现在开发的时,没有问题,等到了测试或生产环境,就会出现找不到sql文件问题。当然,这里的文件规则,需要自己定义好,不要扫到了本不应加载的其他包中的文件了。

总结

到此这篇关于Spring Boot中自动执行sql脚本的文章就介绍到这了,更多相关Spring Boot自动执行sql脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Javaweb状态管理的Session和Cookie

    详解Javaweb状态管理的Session和Cookie

    这篇文章主要介绍了Javaweb状态管理的Session和Cookie,将浏览器与web服务器之间多次交互当做一个整体来处理,并且多次交互所涉及的数据(状态)保存下来,需要的朋友可以参考下
    2023-05-05
  • Spring框架应用的权限控制系统详解

    Spring框架应用的权限控制系统详解

    在本篇文章里小编给大家整理的是关于基于Spring框架应用的权限控制系统的研究和实现,需要的朋友们可以学习下。
    2019-08-08
  • Hadoop源码分析四远程debug调试

    Hadoop源码分析四远程debug调试

    本篇是Hadoop源码分析系列文章第四篇,主要介绍一下Hadoop的远程debug调试步骤,后续本系列文章会持续更新,有需要的朋友可以借鉴参考下
    2021-09-09
  • java中i = i++和i =++i的深入讲解

    java中i = i++和i =++i的深入讲解

    这篇文章主要介绍了java中i = i++和i =++i的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • mybatis 获取更新(update)记录的id之<selectKey>用法说明

    mybatis 获取更新(update)记录的id之<selectKey>用法说明

    这篇文章主要介绍了mybatis 获取更新(update)记录的id之<selectKey>用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • SpringBoot使用Quartz无法注入Bean的问题及解决

    SpringBoot使用Quartz无法注入Bean的问题及解决

    这篇文章主要介绍了SpringBoot使用Quartz无法注入Bean的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • java 对象的序列化和反序列化详细介绍

    java 对象的序列化和反序列化详细介绍

    这篇文章主要介绍了java 对象的序列化和反序列化的相关资料,需要的朋友可以参考下
    2016-10-10
  • Java线程的三种创建方式

    Java线程的三种创建方式

    这篇文章主要给大家分享的是ava线程的三种创建方式,Thread、Runnable和Thread、Runnable和Thread,想了解具体方式的小伙伴可以参考下面文章内容,希望对你有所帮助
    2021-11-11
  • Kotlin 基础教程之数组容器

    Kotlin 基础教程之数组容器

    这篇文章主要介绍了Kotlin 基础教程之数组容器的相关资料,需要的朋友可以参考下
    2017-06-06
  • SpringBoot中的Logging详解

    SpringBoot中的Logging详解

    这篇文章主要介绍了SpringBoot中的Logging详解,log配置可能是被忽视的一个环节,一般的项目中日志配置好了基本上很少去改动,我们常规操作是log.info来记录日志内容,很少会有人注意到springBoot中日志的配置,需要的朋友可以参考下
    2023-09-09

最新评论