zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    自己实现 一个 Vue框架,包含了Vue的核心原理
    Vue-Cli 3.0 中配置高德地图的两种方式
    element-ui table 点击某行高亮(修改背景色)
    input type="file"获取文件名方法
    使用 http-proxy-middleware 做转发, post 请求转发失败
    core-js@2 core-js@3报错问题
    VUE判断当前设备是PC还是移动端
    Vue函数式组件 简单实现
    清明节哀悼日网页变黑白色的CSS代码
    Vue实现递归menu
  • 原文地址:https://www.cnblogs.com/felixzh/p/10796378.html
Copyright © 2011-2022 走看看