在Spring Boot中加载初始化数据
在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中加载初始化数据的更多相关文章
- spring boot启动加载项CommandLineRunner
spring boot启动加载项CommandLineRunner 在使用SpringBoot构建项目时,我们通常有一些预先数据的加载.那么SpringBoot提供了一个简单的方式来实现–Comman ...
- ArcGIS客户端API中加载大量数据的几种解决办法
ArcGIS客户端API中加载大量数据的几种解决办法 2011-03-25 18:17 REST风格的一切事物方兴未艾,ArcGIS Server的客户端API(Javascript/Flex/Sil ...
- Spring Boot 启动加载数据 CommandLineRunner
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...
- 十三、 Spring Boot 启动加载数据 CommandLineRunner
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...
- spring boot启动加载数据
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求.为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实 ...
- 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
转:http://blog.csdn.net/linxingliang/article/details/52069503 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求 ...
- (23)Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
[Spring Boot 系列博客] )前言[从零开始学Spring Boot] : http://412887952-qq-com.iteye.com/blog/2291496 )spring bo ...
- Spring Boot 配置加载顺序详解
使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 ...
- Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅
在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...
随机推荐
- H - 覆盖的面积(线段树-线段扫描 + 离散化(板题))
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1 ...
- 分派pie(二分法)
2.问题描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成:可以是一整个派 ...
- 【Java技术系列】爱情36技之Bug大战
1. 鲁迅先生说:程序员,天不怕地不怕,就怕小虫儿爬呀爬,爬呀爬. 随着时间的推移,鲁迅先生又说:真正勇猛的程序员,敢于让虫子面对惨淡的虫生. 虫子在程序员心中是啥东西?虫子的学名为 Bug,是多少入 ...
- PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分)
PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分) 7-37 模拟EXCEL排序 (25 分) Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. ...
- Linux基础:Day06
网路安全介绍背景: 早起的互联网 -- 1980年代 ,我们需要共享数据,传输数据:所传输或者共享的数据均为明文: 随着互连网发展,安全称为了国家的一种战略资源: 我们做的,比如编程,运维 -- 手工 ...
- java编写规范
编码规范 转载于:https://www.cnblogs.com/ftl1012/p/javaCode.html 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的 ...
- IntelliJ IDEA 在方法大括号中{}点击回车多出一个},如何取消
在 File - settings - Editor - General- Smart Keys - Enter 去掉 Insert pair '}' 的对勾就可以了
- Pytest系列(20)- allure结合pytest,allure.step()、allure.attach的详细使用
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 allure除了支持pyte ...
- spring jar 包 用处功能:
自己积累的: @ spring-context-3.0.5.RELEASE.jar :主要用于 spring程序中加载类 ApplicationContext 用.eq: ApplicationC ...
- C#多线程(6):线程通知
目录 AutoRestEvent 类 常用方法 一个简单的示例 解释一下 复杂一点的示例 解释 回顾一下,前面 lock.Monitor 部分我们学习了线程锁,Mutex 部分学习了进程同步,Sema ...