在Spring Boot中加载初始化数据

在Spring Boot中,Spring Boot会自动搜索映射的Entity,并且创建相应的table,但是有时候我们希望自定义某些内容,这时候我们就需要使用到data.sql和schema.sql。

依赖条件

Spring Boot的依赖我们就不将了,因为本例将会有数据库的操作,我们这里使用H2内存数据库方便测试:

        <dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

我们需要使用JPA来创建Entity:

@Entity
public class Country { @Id
@GeneratedValue(strategy = IDENTITY)
private Integer id; @Column(nullable = false)
private String name; //...
}

我们这样定义repository:

public interface CountryRepository extends CrudRepository<Country, Integer> {
List<Country> findByName(String name);
}

如果这时候我们启动Spring Boot程序,将会自动创建Country表。

data.sql文件

上面我们创建好了数据表格,我们可以使用data.sql来加载文件:

INSERT INTO country (name) VALUES ('India');
INSERT INTO country (name) VALUES ('Brazil');
INSERT INTO country (name) VALUES ('USA');
INSERT INTO country (name) VALUES ('Italy');

在data.sql文件中我们插入了4条数据,可以写个测试例子测试一下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = LoadIniDataApp.class)
public class SpringBootInitialLoadIntegrationTest { @Autowired
private CountryRepository countryRepository; @Test
public void testInitDataForTestClass() {
assertEquals(4, countryRepository.count());
}
}

schema.sql 文件

有时候我们需要自定义数据库的schema,这时候我们可以使用到schema.sql文件。

先看一个schema.sql的例子:

CREATE TABLE country (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(128) NOT NULL,
PRIMARY KEY (id)
);

Spring Boot会自动加载这个schema文件。

我们需要关闭spring boot的schema自动创建功能以防冲突:

spring.jpa.hibernate.ddl-auto=none

spring.jpa.hibernate.ddl-auto 有如下几个选项:

  • create : 首先drop现有的tables,然后创建新的tables
  • update : 这个模式不会删除现有的tables,它会比较现有的tables和新的注解或者xml配置是否一致,然后更新。
  • create-drop : 和create很类似,不同的是会在程序运行完毕后自动drop掉tables。通常用在单元测试中。
  • validate : 只会做table是否存在的验证,不存在则会报错。
  • none : 关闭ddl自动生成功能。

如果Spring Boot没有检测到自定义的schema manager的话,则会自动使用create-drop模式。否则使用none模式。

@sql注解

@Sql 是测试包中的一个注解,可以显示的导入要执行的sql文件,它可以用在class上或者方法之上,如下所示:

    @Test
@Sql({"classpath:new_country.sql"})
public void testLoadDataForTestCase() {
assertEquals(6, countryRepository.count());
}

上面的例子将会显示的导入classpath中的new_country.sql文件。

@Sql有如下几个属性:

  • config : 用来配置SQL脚本,我们在下面的@SqlConfig详细讲解。
  • executionPhase : 可以选择脚本是在BEFORE_TEST_METHOD 或者 AFTER_TEST_METHOD来执行。
  • statements: 可以接受内联的sql语句
  • scripts: 可以指明要执行脚本的路径

@SqlConfig 注解

@SqlConfig主要用在class级别或者用在@Sql注解的config属性中:

    @Sql(scripts = {"classpath:new_country2.sql"},
config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED))

@SqlConfig有如下几个属性:

  • blockCommentStartDelimiter: 指明了SQL脚本的开始标记。
  • blockCommentEndDelimiter: SQL脚本的结束标记。
  • commentPrefix: SQL 脚本的注释标记
  • dataSource : javax.sql.DataSource的名字,指定该脚本将会在什么datasource下执行
  • encoding: SQL 文件的编码
  • errorMode: 脚本遇到错误的处理模式
  • separator: 分隔符
  • transactionManager: 指定的PlatformTransactionManager
  • transactionMode: 事务模式

@Sql是可以多个同时使用的,如下所示:

    @Test
@Sql({"classpath:new_country.sql"})
@Sql(scripts = {"classpath:new_country2.sql"},
config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED))
public void testLoadDataForTestCase() {
assertEquals(6, countryRepository.count());
}

本文的例子可以参考 : https://github.com/ddean2009/learn-springboot2/tree/master/springboot-load-ini-data

更多教程请参考 flydean的博客

在Spring Boot中加载初始化数据的更多相关文章

  1. spring boot启动加载项CommandLineRunner

    spring boot启动加载项CommandLineRunner 在使用SpringBoot构建项目时,我们通常有一些预先数据的加载.那么SpringBoot提供了一个简单的方式来实现–Comman ...

  2. ArcGIS客户端API中加载大量数据的几种解决办法

    ArcGIS客户端API中加载大量数据的几种解决办法 2011-03-25 18:17 REST风格的一切事物方兴未艾,ArcGIS Server的客户端API(Javascript/Flex/Sil ...

  3. Spring Boot 启动加载数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  4. 十三、 Spring Boot 启动加载数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  5. spring boot启动加载数据

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求.为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实 ...

  6. 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】

    转:http://blog.csdn.net/linxingliang/article/details/52069503 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求 ...

  7. (23)Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】

    [Spring Boot 系列博客] )前言[从零开始学Spring Boot] : http://412887952-qq-com.iteye.com/blog/2291496 )spring bo ...

  8. Spring Boot 配置加载顺序详解

    使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 ...

  9. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

    在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...

随机推荐

  1. 《Java基础复习》-控制执行流程

    最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...

  2. Appium自动化(1) - 环境准备详细教程

    Appium需要用到的工具 链接:https://pan.baidu.com/s/1od9x-1l0ALGRT5T6QFDHWg 提取码:bnhq 安装Appium Pyhton client包 1. ...

  3. 1012 The Best Rank (25 分)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  4. Visual Studio Code 1.44 解决中文代码显示乱码问题(小白图文教程)

    现今主流的计算机中文字符编码方案是:GBK和UTF-8. 不同编码方案使用不同的字符集,GBK字符集在中文字符长度和字符数量上存在绝对优势,但对国外字符并不支持.所以,完全面向国内的程序/网页使用的是 ...

  5. LeetCode 题解 | 70. 爬楼梯

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...

  6. Nagios监控服务

    Nagios监控服务 案例1:常用系统监控命令 案例2:搭建nagios监控服务器 案例3:配置文件及插件使用 案例4:监控远程主机的公有数据 案例5:监控远程主机的私有数据 1 案例1:常用系统监控 ...

  7. Scratch 怎么打开SB文件怎么打开

    扩展名是.sb( )的文件均可以用匹配版本的scratch或比匹配版本高的scratch打开,列表如下:类型 可打开.sb ···1.4(1.3).sb2 ···2.0.sb3··· 3.0或3.0b ...

  8. 使用mpvue开发小程序教程

    从vue到mpvue再到微信小程序,这么几天下来感觉被搞晕了.三者之间的很多功能存在差异,项目也快接近尾声了,坑也踩了很多了,现在给后来的你们一点总结性经验: 1. 在模板中,动态插入HTML的v-h ...

  9. Docker多网卡

    # 查看所有网络 docker network ls # 如果要查看更加详细的虚拟网卡,如下指令 docker network inspect [NetWorkEthName | NetWorkEth ...

  10. Java第二十四天,线程安全

    线程安全 1.定义 多线程访问共享数据,会产生线程安全问题. 2.代码模拟 卖票Ticked类: package com.lanyue.day22; public class Person { pub ...