Sprint
Boot应用可以在启动的时候自动执行项目根路径下的SQL脚本文件。我们需要先将sql脚本写好,并将这些静态资源都放置在src/main/resources文件夹下。

再配置application.yml:

spring.datasource.initialization-mode

     
必须配置初始化模式initialization-mode,否则不生效。initialization-mode属性有always、embedded和never。

* always表示Spring Boot应用启动时始终执行数据库初始化
* embedded表示只初始化内存数据库,比如H2数据库
* never表示从不执行初始化数据库
       
需要注意的是,配置之后,每次启动都会执行一遍sql文件。但是我们一般都是要求只执行一次。所以我们需要在sql语句中,处理好如果已存在的处理方式。如建表语句中加入:if
not exist 判断建表。

spring.datasource.platform

     spring.datasource.platform是数据库平台内容配置项,主要有mysql、postgresql、oracle等。

spring.datasource.schema

    spring.datasource.schema一般配置的是存放的是DDL脚本,即通常为创建或更新库表的脚本。该配置项时数组模式,所以可以配置多个:

application.xml:配置方式:

spring.datasource.schema[0]=classpath:sql/schema-${spring.datasource.platform:mysql}.sql

spring.datasource.schema[1]=classpath:sql/schema-${spring.datasource.platform:mysql}-1.sql

application.yml:配置方式:
spring:
  datasource:
    schema: classpath:sql/schema-${spring.datasource.platform:mysql}.sql,
classpath:sql/schema-${spring.datasource.platform:mysql}-1.sql

spring:
  datasource:
    schema:
      - classpath:sql/schema-${spring.datasource.platform:mysql}.sql
      - classpath:sql/schema-${spring.datasource.platform:mysql}-1.sql
spring.datasource.data

spring.datasource.data中一般是DML脚本,即通常为数据插入脚本

该配置项时数组模式,所以可以配置多个:

application.xml:配置方式:

spring.datasource.data[0]=classpath:sql/data-${spring.datasource.platform:mysql}.sql

spring.datasource.data[1]=classpath:sql/data-${spring.datasource.platform:mysql}-1.sql

application.yml:配置方式:
spring:
  datasource:
    data: classpath:data_1.sql, classpath:data_2.sql

spring:
  datasource:
    data:
      - classpath:data_1.sql
      - classpath:data_2.sql
spring.datasource.separator

     
 spring.datasource.separator是配置sql的断句分割符的,默认是以';'作为断句的分隔符的。但是很多时候我们的sql语句中包含";"但是不是一整个sql语句,这时候使用”;“作为分隔符就会报错。

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have
an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near 'xxxxxx' at line 1

例如我们有存储过程
-- 当存储过程`pro1`存在时,删除。 drop procedure if exists pro1; -- 创建存储过程`p1` create
procedure pro1() begin declare row_num int; select count(*) into row_num from
`t_user` where id = 'root'; if row_num = 0 then INSERT INTO
`t_user`(`username`, `password`) VALUES ('root', '123456'); end if; end; --
调用存储过程`pro1` call pro1(); drop procedure if exists pro1;

这时候就会报错。通过 spring.datasource.separator我们就可以将默认的断句分割符改为指定值。如:spring.datasource.separator=$$。
-- 当存储过程`pro1`存在时,删除。 drop procedure if exists pro1;$$ -- 创建存储过程`p1` create
procedure pro1() begin declare row_num int; select count(*) into row_num from
`t_user` where username = 'root'; if row_num = 0 then INSERT INTO
`t_user`(`username`, `password`) VALUES ('root', '123456'); end if; end;$$ --
调用存储过程`pro1` call pro1();$$ drop procedure if exists pro1;$$
 但是,由于pring.datasource.separator是全局的配置,一但将sql脚本的断句分隔符从';'变成'$$',所以需要在DDL、DML语句的
';'后加'$$',不然可能会出现将整个脚本当成一条sql语句来执行的情况。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信