SpringBoot在初始化时执行sql,实现初始化数据库

2022-08-15 09:29:42

前言

最近需要在SpringBoot初始化时,执行特定的SQL,实现数据库的初始化。如:检测表是否存在,不存在则自动创建等。不算复杂,但是网上目前存在的解决方案比较多,很多最后都是无效的。

  • 一种方法是在spring.datasource.schema中配置sql所在位置,但是这个方法在我用的springboot2.5中已经无效了;
  • 一种方法是在启动时读取sql文件,然后动态连接数据库执行sql,这点我尝试后没有什么效果。

使用DataSourceInitializer的方式实现,十分简单,而且可以动态扩展。下面我就详细介绍一下:

实现方法

  1. 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;
  1. 新建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;}}
  1. 启动项目,可以看到数据库下已经创建表了
    创建图
  • 作者:GIS开发者
  • 原文链接:https://hanbo.blog.csdn.net/article/details/119547354
    更新时间:2022-08-15 09:29:42