2.12 数据库初始化
2.12.1 数据库结构初始化
在Spring Boot下会根据我们的实体类的配置自动生成DDL(Data Definition Language数据定义语言,用来定义数据库结构),它可由下面两个外部配置属性开启(二选一):
spring.jpa.generate-ddl: true
是否在启动时初始化数据库结构。
spring.jpa.hibernate.ddl-auto: create
相对于上一种配置方式,更倾向使用这里hibernate提供的配置,它提供更细粒度的配置。
该配置一共有5项可选:
none
:关闭DDL处理;validate
:验证数据库结构,对数据库没有改变;update
:如果需要更新数据库结构;create
:创建数据库结构并销毁以前的数据;create-drop
:创建数据库结构并在会话关闭后销毁结构。
在使用内嵌数据库时,默认为create-drop
;其他情况下默认为none
。
2.12.2 脚本初始化
DataSourceAutoConfiguration
还为我们提供了使用sql脚本来初始化数据库的功能。Spring Boot会自动处理根类路径位置的schema.sql
和data.sql
,还可以根据spring.datasource.platform
定义的platform
自动处理schema-${platform}.sql
和data-${platform}.sql
,platform
可使用数据库品牌hsqldb
, h2
, oracle
, mysql
, postgresql
等。
我们使用schema.sql
来存放DDL(CREATE、ALTER、DROP),使用data.sql
来存放DML(Data Manipulation Language数据操作语言,包含INSERT、UPDATE、DELETE)。
我们首先在外部属性做下面配置:
spring.datasource.initialization-mode: always
关闭Hibernate自动生成DDL,让脚本来接管数据库的初始化。直接删除配置语句或:
spring.jpa.hibernate.ddl-auto: none
建立schema.sql
放置在src/main/resources
目录下:
CREATE TABLE IF NOT EXISTS another_person(
id bigint(20) NOT NULL AUTO_INCREMENT, //ID使用自增
name varchar(255) NOT NULL,
age int(11) DEFAULT NULL,
PRIMARY KEY (id)
);
建立data.sql
放置在src/main/resources
目录下:
INSERT INTO another_person (name, age) VALUES ('wyf', 35);
INSERT INTO another_person (name, age) VALUES ('foo', 34);
INSERT INTO another_person (name, age) VALUES ('bar', 33);
INSERT INTO another_person (name, age) VALUES ('www', 32);
对应的实体为:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "another_person")
public class AnotherPerson {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //使用MySQL的自增
private Long id;
private String name;
private Integer age;
}
我们启动应用:
在第二次启动前,我们关闭初始化,以防第二次启动data.sql
插入重复的数据,因为id是自动生成的:
spring.datasource.initialization-mode: never
若我们在data.sql
里指定了数据的id,第二次启动会有主键冲突错误。如果有应用因SQL脚本执行导致错误,我们做以下设置:
spring.datasource.continue-on-error: true
新书推荐:
我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
主要包含目录有:
第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和批处理(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。