lrkgithub / Spring-Security-Reference-CN

8 stars 4 forks source link

### 数据库初始化 #11

Open lrkgithub opened 4 years ago

lrkgithub commented 4 years ago

数据库初始化

(使用 Spring Boot 来)初始化 SQL 数据库有很多种方式,不同的技术栈有不同的方法。当然,只要数据库是独立运行的,你总可以手动的初始化它(手动执行建表语句)。

1 使用JPA初始化数据库

JPA有自动生成DDL(Data Definition Language,数据库模式定义语言)的功能,因此可以在刚启动的时候就对数据库进行操作。有两个外部属性配置可以配置:

2 使用Hibernate初始化数据库

spring.jpa.hibernate.ddl-auto共有四种值,分别是nonevalidateupdatecreate-drop。Spring Boot根据你的数据库是否是内嵌的,会选择不同的默认值。内嵌的数据库(例如, hsqldb, h2, derby)默认值为create-drop,非内嵌的默认值为none。Spring Boot判断数据库是否是内嵌的标准是他们的 连接协议 类型,如果是hsqldbh2derby 连接协议,则认为是内嵌的,否则就不是。所以,当你从内嵌式的数据库切换到独立运行的数据库时,需要小心,不能假设数据库中的表会被自动创建。你必须设置ddl-auto,或者其他方式来建表。

另外说一句,import.sql这个文件如果存在 classpath 的根路径位置,那么它会被自动执行。我们建议,这个功能最好只在demo或测试环境中使用,而不要用在真正的生产环境中。这个功能 Spring 也没有关系,他是Hibernate 的功能。

3 使用 Spring JDBC 初始化数据库

Spring JDBC 有一个默认开启的 DataSource 初始化器的功能。它会自动执行在 classpath 根路径下的 schema.sql 文件和 data.sql 文件。这些文件还可以是这样的形式:schema-${platform}.sql 或者 data-${platform}.sql,其中 platformspring.datasource.platform 的值。这个值通常就是数据库的名称,比如 mysqlpostgresql 之类的。始化器默认开启 failfast 的。上面所说的这些脚本的路径,可以通过 spring.datasource.schemaspring.datasource.data 配置来修改。spring.datasource.initialize=false 这个配置用来关闭 Spring JDBC 的自动初始化功能。

spring.datasource.continueonError=true ,这个配置可以用来关闭 Spring JDBC 的初始化器 failfast 功能。如果你的应用已经很成熟了,不需要在每次部署时,都去修改一下数据的表结构,那么建议配上这个配置,让 Spring Boot 少做无用功。

如果你在一个 JPA 应用(指,hibernate)中使用 schema.sql 初始化方式,那么 ddl-auto=create-drop 这个配置会导致错误,原因是 Hibernate 会尝试创建相同的表。这种情况,ddl-auto 应该设置为 “”(更好些),或者 “none”。然而,data.sql 是不会受 ddl-auto=create-drop 的影响的。