5.2自动扫描及装配数据
在前面的章节中,我们手动的添加代码在StartupRunner的方法中,为了在启动项目时可以装配我们的数据。然而,这不 一个好的方法,更好的方式是将数据准备、改变和其它的配置独立出来。Sring 提供了更直接和容易的方式去解决这个问题。
Spring 提供了一对方法让数据结构和数据插入到数据库。第一种方法是依赖于Hibernate,当我们创建了对象,并且加入注释@Entity时,Hibernate就会为我们创建表结构。同时,我们使用import.sql的文件去初始化数据。第二种方法是,我们使用旧的Spring的JDBC,这个依赖于schema.sql文件,该文件是声明表;和data。sql文件去包含数据初始化。
5.2.1代码实现
- 首先,我们移除掉在StartupRunner的run方法的内容,不需要在启动时去初始化数据,如下:
Author author = new Author("Alex", "Antonov"); |
- 接着,将我们要初始化数据写入到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) |
- 在我们执行gradlew clean test之前,需要将我们创建好的import.sql的文件放入到src/test/resource的目录下。
- 在实现另外一种方法之前,先将上面创建好的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; |
- 接着,我们需要告诉Hibernate在启动项目时,不需要自动去装配或创建数据。我们需要在src/main/resource/application.properties文件中加入这一行配置:spring.jpa.hibernate.ddl-auto=none。注意,使用测试文件的话,也要在esc/test/ressource下创建同样的application.properties的文件。
- 执行gradle test.
注意:笔者在测试类执行时有遇到过创建表时的错误,但是项目启动去加载这两份文件是没有问题的。
5.2.2代码说明
5.2.2.1使用Spring JPA和Hibernate初始化数据库
在前面的例子中,大部分的工作是由Hibernate的包来实现的,我们仅仅是配置一些文件。Hibernate的工作如下:
- spring.jpa.hibernate.ddl = create-drop的配置,声明Hibernate使用被注释了@Entity的实体并基于它们的表结构去创建数据表。在我们启动应用时,Hibernate会去初始化表结构,当应用结束后,这些表构造会被销毁。即使,在强行停止项目或重启项目,只要探测到有表的表的存在,都会先删除掉表。所以这个的话,加入上面这个语句不是好的方法,这个只能在测试环境中使用,在生产环境中不能使用。
需要注意的是,如果我们没有配置spring.jpa.hibernate.ddl-auto在配置文件,Spring Boot默认是会使用create-drop,这一点需要注意。
- import.sql文件也是通过Hibernate来执行的。这个是来执行我们已经明确了的SQL语句,在项目启动时使用。笔者推荐使用这种方式,当你写了SQL的语句,如INSERT或UPDATE,并且你熟悉表结构。而接下到扫描并执行文件的工作就由Hibernate来做了。
5.2.2.2 使用Spring JDBC初始化数据
如果你不想使用JPA或你不想使用Hibernate去执行数据库工作。Spring提供了其它方式去实现,也就是spring-boot-starter-jdbc。让我们看一下这是如何实现:
- spring.jpa.hibernate.ddl = none 的配置告诉Hibernate不需要自动去操作数据库,即使Hibernate的依赖是存在的。这个方式在生产环境上是很好的。
- schema.sql文件存在于项目的根目录下。在每一次开始应用时,都会去扫描这个文件。,然后,这人跟Hibernate有不同的地方是,它不会去删除表,所以在我们创建表的时候,要记得加上CREATE TABLE IF NOT EXISTS.
- 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自动扫描及装配数据相关推荐
- Spring bean 装配
装配 bean 1. 自动化装配 @Component 告知Spring为被注解的类创建bean > 为bean命名: > + Spring为Bean默认命名为类名首字母小写 > + ...
- java引入bean代码_通过java代码装配bean
importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annot ...
- 第二章 装配bean
本章内容 声明bean 构造器注入和Setter方法注入 装配bean 控制bean的创建和销毁 在Spring中,对象无需自己查找或创建与其所关联的其他对象,相反,容器负责把需要协作的对象引用赋予给 ...
- Android Jason数据解析及显示
前言: 最近在忙一个App的修改工作,发现很多地方有使用到Jason进行数据封装和解析.现在通过一个小例子予以总结. 什么是Jason? 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性. ...
- Spring - 装配bean
创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质 一.自动化装配bean(推荐方式) Spring从两个角度来实现自动化装配: 组件扫描:Spring会自动发现 ...
- 《Spring实战》读书笔记_装配bean
目录 依赖注入 未使用依赖注入 使用依赖注入 装配bean 自动装配 自动扫描 自动装配 用法 原理 通过Java代码装配Bean 通过XML装配Bean(省略) 自动装配的歧义性 演示歧义性 演示一 ...
- Spring实战(第4版)第2章 装配Bean
文章目录 Spring实战(第4版)第2章 装配Bean 2.1 Spring配置的可选方案 2.2 自动化装配bean 2.2.1 创建可被发现的bean 2.2.2 为组件扫描的bean命名 2. ...
- 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构
前几天向大家介绍了一种用工具类生成数据表的方法,不过之前的方法需要使用一个跟项目关系不大的工具类.不免让人觉得有些多余,所以呢,今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...
- SSH框架整合(代码加文字解释)
一.创建数据库并设置编码. A) create database oa default character set utf8. 二.MyEclipse工程 A) 在Myeclipse里创建web工程, ...
- spring-boot注解详解(六)
@Target @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages.types(类.接口.枚举.Annotation类型).类型成员(方法.构造方 ...
最新文章
- [网页设计]点睛价值
- oracle新建用户和授权及其删除
- “约见”面试官系列之常见面试题第十一篇之canvas(建议收藏)
- 【算法分析与设计】浅析二分查找
- UI基本设计素材模板|完整的线框图
- maven配置(myeclipse版)
- 移动端学习笔记(小强测试品牌学员作品)
- 算法实践——改良的求解数独的暴力搜索法
- python文本分析工具_可以用来分析文本数据的Python工具的完整指南
- cocos2d-x 源码分析 总目录
- C语言错误类型中英文对照表
- 医院招聘护士 计算机证,医院招聘护士的自我介绍
- Redis持久化中的AOF(Append Only File)持久化
- linux开篇——硬盘和mbr简介
- rtx3060ti、rtx3060和rtx2080ti 参数对比哪个好 差距大不大
- 网站的养站(养蜘蛛)技巧
- mysql替换空行解决导出到excel时由于内容有换行回车导致的问题
- 浏览器如何显示页面(二)
- qt之定时关机重启助手,带系统托盘控制。
- Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目NLU Data详解(七十一)
热门文章
- Does Your Wooden Surface Really Need Sealing?
- Windows下将jar包封装成服务程序
- Educational Codeforces Round 23 F. MEX Queries(线段树)
- js限制文本框只能输入数字方法小结(转)
- [转]MFC与Qt的内存管理
- 在java中获取当前系统时间 插入数据库中的时间值没有时间只有日期的原因...
- android获取按钮上的字,Android--在一个Button上显示不同类型的字体
- 基于node.js的express使用mysql语句在插入数据时防重插入
- 使用pythonping检查设备的连通性并记录可达设备(eNSP模拟器)
- PIM SM建立SPT树过程与实验