文档章节

初始化数据库和导入数据

o
 osc_mervd488
发布于 2018/04/23 20:43
字数 1772
阅读 5
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

Spring Boot应用的测试一文中,我们在StarterRunner类的run(...)方法中给数据库中添加一些初始数据。尽管通过编程方式添加初始数据比较快捷方便,但长期来看这并不是一个好办法——特别是当需要添加的数据量很大时。我们开发最好把数据库准备、数据库修改和数据库的配置与将要运行的程序代码分离,尽管这仅仅是为测试用例做准备。Spring Boot已经提供了相应的支持来完成这个任务。

我们在之前的应用程序基础上进行实验。Spring Boot提供两种方法来定义数据库的表结构以及添加数据。第一种方法是使用Hibernate提供的工具来创建表结构,该机制会自动搜索@Entity实体对象并创建对应的表,然后使用import.sql文件导入测试数据;第二种方法是利用旧的Spring JDBC,通过schema.sql文件定义数据库的表结构、通过data.sql导入测试数据。

How Do

  • 首先,将现有的“编程式初始化数据”的代码注释掉,因此在StarterRunner中run方法中注释掉下列代码:
@Override
    public void run(String... strings) throws Exception {
//        Author author = new Author("du", "qi");
//        authorRepository.save(author);
//        Publisher publisher = new Publisher("中文测试");
//        publisherRepository.save(publisher);
//        Book book = new Book(author, "9876-5432-1111", publisher, "瞅啥");
//        book.setDescription("23333333,这是一本有趣的书");
//        bookRepository.save(book);
        logger.info("Number of books: " + bookRepository.count());
    }
  • 在resources目录下新建import.sql文件(注意,SQL语句中指定的字段要与Hibernate自动生成的表的字段相同),该文件的内容如下:
INSERT INTO author (id, first_name, last_name) VALUES (1, 'Alex', 'Antonov');
INSERT INTO publisher (id, name) VALUES (1, 'Packt');
INSERT INTO book (isbn, title, author, publisher) VALUES ('9876-5432-1111', 'Spring Boot Recipes', 1,1);
  • 现在运行测试用例,发现可以通过;
  • 第二种方法是获取Spring JDBC的支持,需要我们提供schema.sql和data.sql文件。现在可以将import.sql重命名为data.sql,然后再创建新的文件schema.sql。在删除数据表时,需要考虑依赖关系,例如表A依赖表B,则先删除表B。创建数据库关系的内容如下:
-- clear context
DROP TABLE IF EXISTS `book_reviewers`;
DROP TABLE IF EXISTS `reviewer`;
DROP TABLE IF EXISTS `book`;
DROP TABLE IF EXISTS `author`;
DROP TABLE IF EXISTS `publisher`;

-- Create syntax for TABLE '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`)
);

-- Create syntax for TABLE 'publisher'
CREATE TABLE `publisher` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) DEFAULT NULL ,
  PRIMARY KEY (`id`)
);

-- Create syntax for TABLE '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` BIGINT(20) DEFAULT NULL ,
  `publisher` BIGINT(20) DEFAULT NULL ,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK_publisher` FOREIGN KEY (`publisher`) REFERENCES `publisher` (`id`),
  CONSTRAINT `FK_author` FOREIGN KEY (`author`) REFERENCES `author` (`id`)
);

-- Create syntax for TABLE '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`)
);

-- Create syntax for TABLE 'book_reviewers'
CREATE TABLE `book_reviewers` (
  `books` BIGINT(20) NOT NULL ,
  `reviewers` BIGINT(20) NOT NULL ,
  CONSTRAINT `FK_book` FOREIGN KEY (`books`) REFERENCES `book` (`id`),
  CONSTRAINT `FK_reviewer` FOREIGN KEY (`reviewers`) REFERENCES `reviewer` (`id`)
);
  • 我们手动创建了数据库表结构,因此需要关掉Hibernate的自动创建开关,即在application.properties中设置spring.jpa.hibernate.ddl-auto = none
  • 运行测试,发现测试可以正常通过。

Note:个人建议是使用Hibernate的自动创建机制,当然这会少一点可定制性;最近更流行的是Mybatis,mybatis-spring-boot也可以使用,mybatis的可定制性更强。

分析

在Spring社区中常常可以通过使用各种组件,例如Spring JDBC、Spring JPA with Hibernate,或者Flyway、Liquidbase这类数据库迁移工具,都能实现类似的功能。

Note:Flyway和Liquidbase都提供数据库的增量迁移功能。当项目中需要管理数据库的增量变动,并且需要快速切换到指定的数据版本时,非常适合使用Flyway和Liquidbase,更多的信息可以参考http://flywaydb.org/http://www.liquibase.org/

在上文中我们使用了两种不同的方法来初始化数据库和填充测试数据

使用Spring JPA with Hibernate初始化数据库

这种方法中,由Hibernate库完成大部分工作,我们只需要配置合适的配置项,并创建对应的实体类的定义。在这个方案中我们主要使用以下配置项:

  • spring.jpa.hibernate.ddl-auto=create-drop配置项告诉Hibernate通过@Entity模型的定义自动推断数据库定义并创建合适的表。在程序启动时,经由Hibernate计算出的schema会用来创建表结构,在程序结束时这些表也被删除。即使程序强制退出或者奔溃,在重新启动的时候也会先把之前的表删除,并重新创建——因此"create-drop"这种配置不适合生产环境。PS:如果程序没有显式配置spring.jpa.hibernate.ddl-auto属性,Spring Boot会给H2这类的嵌入式数据库配置create-drop,因此需要仔细斟酌这个配置项。

  • 在classpath下创建import.sql文件供Hibernate使用,该文件中的内容是一些SQL语句,将会在应用程序启动时运行。尽管该文件中可以写任何有效的SQL语句,不过建议只写数据操作语句,例如INSERT、UPDATE等等。

使用Spring JDBC初始化数据库

如果项目中没有用JPA或者你不想依赖Hibernate库,Spring提供另外一种方法来设置数据库,当然,首先需要提供spring-boot-starter-jdbc依赖。

  • spring.jpa.hibernate.ddl-auto=none表示Hibernate不会自动创建数据库表结构。在生产环境中最好用这个设置,能够避免你不小心将数据库全部删除(那一定是一个噩梦)。

  • schema.sql文件包含创建数据库表结构的SQL语句,在应用程序启动过程中,需要创建数据库表结构时,执行该文件中的DDL语句。Hibernate会自动删除已经存在的表,如果我们希望只有某个表不存在的时候才创建它,可以在这个文件开头最好先使用DROP TABLE IF EXISTS删除可能存在的表,再使用CREATE TABLE IF NOT EXISTS创建表。这种用法可以灵活得定义数据库中的表结构,因此在生产环境中用更安全。

  • data.sql的作用跟上一个方法的import.sql一样,用于存放数据导入的SQL语句。

考虑到这是Spring的特性,我们可以不只是全局定义数据库定义文件,还可以针对不同的数据库定义不同的文件。例如,可以定义给Oracle数据库使用的schema-oracle.sql,给MySQL数据库用的schema-mysql.sql文件;对于data.sql文件,则可以由不同数据库共用。如果你希望覆盖Spring Boot的自动推断,可以配置spring.datasource.platform属性。

Tip:如果你希望使用别的名字代替schema.sql或者data.sql,Spring Boot也提供了对应的配置属性,即spring.datasource.schemaspring.datasource.data


链接:https://www.jianshu.com/p/468a8fa752a7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Pychram IDE链接MySQL下更新数据的问题总结

一、今天下午的数据库更新问题做个总结,数据更新的时候出现如下报错: Failed to retrieve routines in mysite_db. [42S02][1146] Table 'mysql.proc' doesn't exist and 1 duplicate repor......

osc_ojkfylwq
2018/03/10
1
0
rs.getXxx()出错:17002原因: Io 异常: Socket closed

在做数据导入时,由于导入数据库的每行数据都需要通过数据库做多次校验,对于不到300条数据的导入,提示连接关闭。这是由于数据库连接超时造成的。 解决方案:1、如果是项目组人员导入初始化...

seven_
2014/07/30
64
0
TRS媒资管理系统迁移总结

1.TRS媒资管理系统使用spring架构,tomcat做后端交互,apache做前端响应,oracle做数据库 2.迁移之后,虽然拷贝配置文件就可以,但是系统启动初始化响应比较慢,apache前端响应时间最好设置久...

W_Lu
2019/08/01
0
0
基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题

#基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题 [toc] 1.产生背景 公司开发项目过程中,后台会分为很多种服务,比如web服务,采集服务,都需要去操作数据库,有的时候甚至前...

osc_b1b5q6vc
2019/10/15
14
0
开发指南专题四:JEECG微云快速开发平台--JEECG开发环境搭建

开发指南专题四:JEECG微云快速开发平台开发环境搭建 1. JEECG开发环境搭建 JEECG推荐的开发环境为Myeclipse8.5/Eclipse3.7+JDK1.6+Tomcat6.0 1.1. JAVA环境配置 通过Oracle的官方地址下载J...

DavidBao
2015/01/01
33
0

没有更多内容

加载失败,请刷新页面

加载更多

VB语言基础重要知识点12

我们课程,我们做一些针对于考试的简要讲解。 一、有关考试的几个问题 首先,提问:考试最重要的是什么? 答案其实很简单:得分!!!!! 想要得分,就要做到基本的保存。 保存哪些文件呢?...

刘金玉编程
2019/10/30
3
0
全网最全JAVA、Python电子书!限时领取,过时不候!

给大家整理了最全的入门+进阶书籍!!! 免费领取,无套路! 加微信发送“电子书” 秒通过,秒发资源! 本文分享自微信公众号 - Python进击者(JAVAandPythonJun)。 如有侵权,请联系 supp...

kuls
01/16
18
0
原创356--免费还是付费

最近得有一个星期,被一个录屏软件(record it)烦到了,本来免费版可以无限制录制,只能720p,GIF不支持,高清不支持,没有剪辑功能。 之前调研了好几种,用起来还是这个方便,就一直用了。...

八音弦
04/24
14
0
数字IC技术讨论群,设计和验证、前端和后端,总有你感兴趣的话题。快满了,需要的抓紧加入。

本文分享自微信公众号 - 白山头讲IC(gray_mount)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

白山头
04/29
5
0
how to install mongodb in centos7

[root@xtwj88 ~]# cat /etc/yum.repos.d/mongodb-org-4.2.repo [mongodb-org-4.2]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86......

qwfys
39分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部