在前面的章节中,我们手动的添加代码在StartupRunner的方法中,为了在启动项目时可以装配我们的数据。然而,这不 一个好的方法,更好的方式是将数据准备、改变和其它的配置独立出来。Sring 提供了更直接和容易的方式去解决这个问题。

Spring 提供了一对方法让数据结构和数据插入到数据库。第一种方法是依赖于Hibernate,当我们创建了对象,并且加入注释@Entity时,Hibernate就会为我们创建表结构。同时,我们使用import.sql的文件去初始化数据。第二种方法是,我们使用旧的Spring的JDBC,这个依赖于schema.sql文件,该文件是声明表;和data。sql文件去包含数据初始化。

5.2.1代码实现

  1. 首先,我们移除掉在StartupRunner的run方法的内容,不需要在启动时去初始化数据,如下:

Author author = new Author("Alex", "Antonov");
author = authorRepository.save(author);
Publisher publisher = new Publisher("Packt");
publisher = publisherRepository.save(publisher);
Book book = new Book("978-1-78528-415-1", "Spring Boot Recipes",
author, publisher);
bookRepository.save(book);

  1. 接着,将我们要初始化数据写入到import.sql文件中,并将该文件放入到src/main/resource的目录下。

INSERT INTO author (id, first_name, last_name) VALUES (110, 'Alex','Antonov')

INSERT INTO publisher (id, name) VALUES (100, 'Packt')

INSERT INTO book (id,isbn, title, author_id, publisher_id) VALUES (120,'978-1-78528-415-1', 'Spring Boot Recipes', 110, 100)

  1. 在我们执行gradlew clean test之前,需要将我们创建好的import.sql的文件放入到src/test/resource的目录下。
  2. 在实现另外一种方法之前,先将上面创建好的import.sql的文件更名为data.sql,然后在相同的目录下创建schema.sql。文件写入如下的内容。

/* Create syntax for TABLE 'author'*/

DROP TABLE IF EXISTS `author`;

CREATE TABLE `author` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`first_name` varchar(255) DEFAULT NULL,

`last_name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

);

commit;

/*Create syntax for TABLE 'publisher'*/

DROP TABLE IF EXISTS `publisher`;

CREATE TABLE `publisher` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

);

commit;

/*Create syntax for TABLE 'reviewer'*/

DROP TABLE IF EXISTS `reviewer`;

CREATE TABLE `reviewer` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`first_name` varchar(255) DEFAULT NULL,

`last_name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

);

commit;

/*Create syntax for TABLE 'book'*/

DROP TABLE IF EXISTS `book`;

CREATE TABLE `book` (`id` bigint(20) NOT NULL AUTO_INCREMENT,

`description` varchar(255) DEFAULT NULL,

`isbn` varchar(255) DEFAULT NULL,

`title` varchar(255) DEFAULT NULL,

`author_id` bigint(20) DEFAULT NULL,

`publisher_id` bigint(20) DEFAULT NULL,

PRIMARY KEY (`id`),

CONSTRAINT `FK_publisher` FOREIGN KEY (`publisher_id`) REFERENCES

`publisher` (`id`),

CONSTRAINT `FK_author` FOREIGN KEY (`author_id`) REFERENCES `author`

(`id`)

);

commit;

/*Create syntax for TABLE 'book_reviewers'*/

DROP TABLE IF EXISTS `book_reviewers`;

CREATE TABLE `book_reviewers` (

`book_id` bigint(20) NOT NULL,

`reviewers_id` bigint(20) NOT NULL,

CONSTRAINT `FK_book` FOREIGN KEY (`book_id`) REFERENCES `book`

(`id`),

CONSTRAINT `FK_reviewer` FOREIGN KEY (`reviewers_id`) REFERENCES

`reviewer` (`id`)

);

commit;

  1. 接着,我们需要告诉Hibernate在启动项目时,不需要自动去装配或创建数据。我们需要在src/main/resource/application.properties文件中加入这一行配置:spring.jpa.hibernate.ddl-auto=none。注意,使用测试文件的话,也要在esc/test/ressource下创建同样的application.properties的文件。
  2. 执行gradle test.

注意:笔者在测试类执行时有遇到过创建表时的错误,但是项目启动去加载这两份文件是没有问题的。

5.2.2代码说明

5.2.2.1使用Spring JPA和Hibernate初始化数据库

在前面的例子中,大部分的工作是由Hibernate的包来实现的,我们仅仅是配置一些文件。Hibernate的工作如下:

  1. spring.jpa.hibernate.ddl = create-drop的配置,声明Hibernate使用被注释了@Entity的实体并基于它们的表结构去创建数据表。在我们启动应用时,Hibernate会去初始化表结构,当应用结束后,这些表构造会被销毁。即使,在强行停止项目或重启项目,只要探测到有表的表的存在,都会先删除掉表。所以这个的话,加入上面这个语句不是好的方法,这个只能在测试环境中使用,在生产环境中不能使用。

需要注意的是,如果我们没有配置spring.jpa.hibernate.ddl-auto在配置文件,Spring Boot默认是会使用create-drop,这一点需要注意。

  1. import.sql文件也是通过Hibernate来执行的。这个是来执行我们已经明确了的SQL语句,在项目启动时使用。笔者推荐使用这种方式,当你写了SQL的语句,如INSERT或UPDATE,并且你熟悉表结构。而接下到扫描并执行文件的工作就由Hibernate来做了。

5.2.2.2 使用Spring JDBC初始化数据

如果你不想使用JPA或你不想使用Hibernate去执行数据库工作。Spring提供了其它方式去实现,也就是spring-boot-starter-jdbc。让我们看一下这是如何实现:

  1. spring.jpa.hibernate.ddl = none 的配置告诉Hibernate不需要自动去操作数据库,即使Hibernate的依赖是存在的。这个方式在生产环境上是很好的。
  2. schema.sql文件存在于项目的根目录下。在每一次开始应用时,都会去扫描这个文件。,然后,这人跟Hibernate有不同的地方是,它不会去删除表,所以在我们创建表的时候,要记得加上CREATE TABLE IF NOT EXISTS.
  3. data.sql文件在项目根目录下,这个应用于SQL语句的执行入库。

这声明这些配置文件时,我们不仅仅需要是全局的,也需要它可以使用在不同的平台上。例如,我们可以声明schema-oracle.sql文件让其使用在Oracle数据库;使用schema-mysql.sql让其使用于MySQL数据库。然而,我们不想在每个平台上者声明一次。所以,spring.datasource.platform的配置可以引导Spring Boot去加载哪种文件。

如果你不想要使用默认的schema.sql和data.sql,Spring Boot提供给我们配置属性去控制spring.datasource.schema和spring.datasource.data.

5.2自动扫描及装配数据相关推荐

  1. Spring bean 装配

    装配 bean 1. 自动化装配 @Component 告知Spring为被注解的类创建bean > 为bean命名: > + Spring为Bean默认命名为类名首字母小写 > + ...

  2. java引入bean代码_通过java代码装配bean

    importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annot ...

  3. 第二章 装配bean

    本章内容 声明bean 构造器注入和Setter方法注入 装配bean 控制bean的创建和销毁 在Spring中,对象无需自己查找或创建与其所关联的其他对象,相反,容器负责把需要协作的对象引用赋予给 ...

  4. Android Jason数据解析及显示

    前言: 最近在忙一个App的修改工作,发现很多地方有使用到Jason进行数据封装和解析.现在通过一个小例子予以总结. 什么是Jason? 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性. ...

  5. Spring - 装配bean

    创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质 一.自动化装配bean(推荐方式) Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现 ...

  6. 《Spring实战》读书笔记_装配bean

    目录 依赖注入 未使用依赖注入 使用依赖注入 装配bean 自动装配 自动扫描 自动装配 用法 原理 通过Java代码装配Bean 通过XML装配Bean(省略) 自动装配的歧义性 演示歧义性 演示一 ...

  7. Spring实战(第4版)第2章 装配Bean

    文章目录 Spring实战(第4版)第2章 装配Bean 2.1 Spring配置的可选方案 2.2 自动化装配bean 2.2.1 创建可被发现的bean 2.2.2 为组件扫描的bean命名 2. ...

  8. 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构

    前几天向大家介绍了一种用工具类生成数据表的方法,不过之前的方法需要使用一个跟项目关系不大的工具类.不免让人觉得有些多余,所以呢,今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...

  9. SSH框架整合(代码加文字解释)

    一.创建数据库并设置编码. A) create database oa default character set utf8. 二.MyEclipse工程 A) 在Myeclipse里创建web工程, ...

  10. spring-boot注解详解(六)

    @Target @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages.types(类.接口.枚举.Annotation类型).类型成员(方法.构造方 ...

最新文章

  1. [网页设计]点睛价值
  2. oracle新建用户和授权及其删除
  3. “约见”面试官系列之常见面试题第十一篇之canvas(建议收藏)
  4. 【算法分析与设计】浅析二分查找
  5. UI基本设计素材模板|完整的线框图
  6. maven配置(myeclipse版)
  7. 移动端学习笔记(小强测试品牌学员作品)
  8. 算法实践——改良的求解数独的暴力搜索法
  9. python文本分析工具_可以用来分析文本数据的Python工具的完整指南
  10. cocos2d-x 源码分析 总目录
  11. C语言错误类型中英文对照表
  12. 医院招聘护士 计算机证,医院招聘护士的自我介绍
  13. Redis持久化中的AOF(Append Only File)持久化
  14. linux开篇——硬盘和mbr简介
  15. rtx3060ti、rtx3060和rtx2080ti 参数对比哪个好 差距大不大
  16. 网站的养站(养蜘蛛)技巧
  17. mysql替换空行解决导出到excel时由于内容有换行回车导致的问题
  18. 浏览器如何显示页面(二)
  19. qt之定时关机重启助手,带系统托盘控制。
  20. Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目NLU Data详解(七十一)

热门文章

  1. Does Your Wooden Surface Really Need Sealing?
  2. Windows下将jar包封装成服务程序
  3. Educational Codeforces Round 23 F. MEX Queries(线段树)
  4. js限制文本框只能输入数字方法小结(转)
  5. [转]MFC与Qt的内存管理
  6. 在java中获取当前系统时间 插入数据库中的时间值没有时间只有日期的原因...
  7. android获取按钮上的字,Android--在一个Button上显示不同类型的字体
  8. 基于node.js的express使用mysql语句在插入数据时防重插入
  9. 使用pythonping检查设备的连通性并记录可达设备(eNSP模拟器)
  10. PIM SM建立SPT树过程与实验