Spring Boot(2.0版后)中自动执行sql脚本


转载自:https://www.jianshu.com/p/4bdbab893397

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

背景

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

1 CREATE TABLE IF NOT EXISTS people(
2     persion_id BIGINT NOT NULL AUTO_INCREMENT,
3     first_name VARCHAR(20),
4     last_name VARCHAR(20),
5     PRIMARY KEY (persion_id)
6 );

实现核心

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

实现方法

  • 前提
    已经构建了DataSource Bean。
  • 方法
    通过@Configuration、@Bean和@Value三个注解实现自定义DataSourceInitializer Bean,现在Bean的定义中实现自动化执行脚本的业务逻辑。
  • 代码
 1 import org.springframework.beans.factory.annotation.Value;
 2 import org.springframework.context.annotation.Bean;
 3 import org.springframework.context.annotation.Configuration;
 4 import org.springframework.core.io.Resource;
 5 import org.springframework.jdbc.datasource.init.DataSourceInitializer;
 6 import org.springframework.jdbc.datasource.init.DatabasePopulator;
 7 import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
 8 import javax.sql.DataSource;
 9 @Configuration
10 public class BatchTaskDataSourceInitializer {
11     /**
12      * 构建Resource对象
13      */
14     @Value("classpath:schema-all.sql")
15     private Resource businessScript;
16 
17     /**
18      * 自定义Bean实现业务的特殊需求
19      * @param dataSource
20      * @return
21      */
22     @Bean
23     public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
24         final DataSourceInitializer initializer = new DataSourceInitializer();
25         // 设置数据源
26         initializer.setDataSource(dataSource);
27         initializer.setDatabasePopulator(databasePopulator());
28         return initializer;
29     }
30 
31     private DatabasePopulator databasePopulator() {
32         final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
33         populator.addScripts(businessScript);
34         return populator;
35     }
36 }

 

作者:大哥你先走
链接:https://www.jianshu.com/p/4bdbab893397
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM