前言
最近需要在SpringBoot初始化时,执行特定的SQL,实现数据库的初始化。如:检测表是否存在,不存在则自动创建等。不算复杂,但是网上目前存在的解决方案比较多,很多最后都是无效的。
- 一种方法是在
spring.datasource.schema
中配置sql所在位置,但是这个方法在我用的springboot2.5中已经无效了;- 一种方法是在启动时读取sql文件,然后动态连接数据库执行sql,这点我尝试后没有什么效果。
使用DataSourceInitializer
的方式实现,十分简单,而且可以动态扩展。下面我就详细介绍一下:
实现方法
- 在
resources
下新建sql文件夹,将自己的sql脚本以独立文件的方式放入该文件夹下
我的测试sql
--创建序列CREATE SEQUENCEifnotexists postgres.style_id_seq
INCREMENT1START1
MINVALUE1
MAXVALUE2147483647
CACHE1;ALTER SEQUENCE postgres.style_id_seq
OWNERTO postgres;--创建样式表CREATETABLEifnotexists postgres.style(
idintegerNOTNULLDEFAULT nextval('style_id_seq'::regclass),
namecharactervarying(255)COLLATE pg_catalog."default"NOTNULL,statusboolean,
style jsonb,
create_timetimestamp withouttime zone,CONSTRAINT style_pkeyPRIMARYKEY(id))TABLESPACE pg_default;ALTERTABLE postgres.style
OWNERto postgres;COMMENTONCOLUMN postgres.style.idIS'主键';COMMENTONCOLUMN postgres.style.nameIS'样式名称';COMMENTONCOLUMN postgres.style.statusIS'状态,是否可用';COMMENTONCOLUMN postgres.style.styleIS'样式json';COMMENTONCOLUMN postgres.style.create_timeIS'创建时间';ALTERTABLE postgres.style
OWNERto postgres;
- 新建config文件夹,创建数据初始化类
packagemap.tile.server.config;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.io.Resource;importorg.springframework.jdbc.datasource.init.DataSourceInitializer;importorg.springframework.jdbc.datasource.init.DatabasePopulator;importorg.springframework.jdbc.datasource.init.ResourceDatabasePopulator;importjavax.sql.DataSource;@ConfigurationpublicclassCustomizeDataSourceInitializer{@Value("classpath:sql/createStyleTable.sql")privateResource sqlScriptSchema;// @Value("classpath:sql/data.sql")// private Resource sqlScriptData;@BeanpublicDataSourceInitializerdataSourceInitializer(finalDataSource dataSource){DataSourceInitializer dataSourceInitializer=newDataSourceInitializer();
dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(databasePopulator());return dataSourceInitializer;}privateDatabasePopulatordatabasePopulator(){ResourceDatabasePopulator populator=newResourceDatabasePopulator();
populator.addScript(sqlScriptSchema);// populator.addScript(sqlScriptData);// populator.addScript(sqlScriptProcedure);//这里可以加入其它的sql脚本文件return populator;}}
- 启动项目,可以看到数据库下已经创建表了